# Table of Contents - [Introduction | Rojo](#introduction-rojo) - [Introduction | Rojo](#introduction-rojo) - [Porting an Existing Game | Rojo](#porting-an-existing-game-rojo) - [Installation | Rojo](#installation-rojo) - [Creating a New Game | Rojo](#creating-a-new-game-rojo) - [Help! | Rojo](#help-rojo) - [Project Format | Rojo](#project-format-rojo) - [Rojo Alternatives | Rojo](#rojo-alternatives-rojo) - [Fully vs Partially Managed Rojo | Rojo](#fully-vs-partially-managed-rojo-rojo) - [Introduction | Rojo](#introduction-rojo) - [Recomended Workflows | Rojo](#recomended-workflows-rojo) - [Sync Details | Rojo](#sync-details-rojo) - [Porting an Existing Game | Rojo](#porting-an-existing-game-rojo) - [Installation | Rojo](#installation-rojo) - [Help! | Rojo](#help-rojo) - [Creating a New Game | Rojo](#creating-a-new-game-rojo) - [Rojo Alternatives | Rojo](#rojo-alternatives-rojo) - [Project Format | Rojo](#project-format-rojo) - [Recomended Workflows | Rojo](#recomended-workflows-rojo) - [Sync Details | Rojo](#sync-details-rojo) - [Porting an Existing Game | Rojo](#porting-an-existing-game-rojo) - [Installation | Rojo](#installation-rojo) - [Help! | Rojo](#help-rojo) - [Creating a New Game | Rojo](#creating-a-new-game-rojo) - [Rojo Alternatives | Rojo](#rojo-alternatives-rojo) - [Project Format | Rojo](#project-format-rojo) - [Recommended Workflows | Rojo](#recommended-workflows-rojo) - [Sync Details | Rojo](#sync-details-rojo) - [Upgrading From Rojo 6 | Rojo](#upgrading-from-rojo-6-rojo) - [Properties | Rojo](#properties-rojo) --- # Introduction | Rojo [Skip to main content](https://rojo.space/docs/v7/#__docusaurus_skipToContent_fallback) Version: v7 On this page Welcome! Rojo is a project management tool designed to get professional resources in the hands of Roblox developers. Here, we'll teach you how to get started with Rojo. This documentation is a continual work in progress. If you find any issues, please file an issue on [the Rojo website issue tracker](https://github.com/rojo-rbx/rojo.space/issues) ! New to Rojo? Check out [Installation](https://rojo.space/docs/v7/getting-started/installation/) . Why Rojo?[​](https://rojo.space/docs/v7/#why-rojo "Direct link to Why Rojo?") ------------------------------------------------------------------------------ Adding a tool like Rojo to your Roblox workflow can be daunting, but it comes with some key advantages. ### Tools[​](https://rojo.space/docs/v7/#tools "Direct link to Tools") There are decades of excellent tools available that operate on files. With Rojo, it's possible to take advantage of any of them! Popular tools that are tailored towards Roblox or Luau in general: * [Selene](https://github.com/Kampfkarren/selene) , a static analysis tool to help you write better Lua * [StyLua](https://github.com/JohnnyMorganz/StyLua) , a formatter that helps keep your code in a consistent style * [Wally](https://github.com/UpliftGames/wally) , a package manager for Roblox projects * [Moonwave](https://github.com/UpliftGames/moonwave) , a documentation generator for Lua projects ### Rojo at RDC 2019[​](https://rojo.space/docs/v7/#rojo-at-rdc-2019 "Direct link to Rojo at RDC 2019") Pepper Riemer (Kampfkarren) gave a talk at RDC 2019 talking about some of the benefits of using a tool like Rojo. ### External Text Editors[​](https://rojo.space/docs/v7/#external-text-editors "Direct link to External Text Editors") Rojo opens the door to use the absolute best text editors in the world and their rich plugin ecosystems. Some very popular editors include [Visual Studio Code](https://code.visualstudio.com/) and [Sublime Text](https://www.sublimetext.com/) . These advanced text editors have features like multi-cursor editing, go-to symbol, multi-file regex find and replace, bookmarks and much more. Rojo users that use Visual Studio Code often use the following extensions: * [luau-lsp](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.luau-lsp) - An [LSP](https://microsoft.github.io/language-server-protocol/) implementation for Luau, Roblox's scripting language. * [StyLua](https://marketplace.visualstudio.com/items?itemName=JohnnyMorganz.stylua) - A VSCode companion for Stylua, which is linked above * [Selene](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.selene-vscode) - A VScode companion for Selene, which is linked above. Note that this often overlaps with luau-lsp's analysis. * [roblox-ui](https://marketplace.visualstudio.com/items?itemName=filiptibell.roblox-ui) - A visualizer for Rojo projects that makes navigating and adding to them easier. ### Version Control[​](https://rojo.space/docs/v7/#version-control "Direct link to Version Control") By building your game (or just the scripts) as individual files on the filesystem, it becomes easy to start using professional-grade version control tools like [Git](https://git-scm.com/) and [GitHub](https://github.com/) . Hundreds of thousands of companies and individual developers use Git to version their software projects. With Rojo, Roblox developers can take advantage of the best collaboration tool around. Using a repository hosting service like GitHub or GitLab brings powerful features to Roblox developers like code reviews and issue tracking that professional engineers can't live without. ### TypeScript[​](https://rojo.space/docs/v7/#typescript "Direct link to TypeScript") TypeScript enables static type safety, which helps prevent typos and adds unparalleled autocompletion. It also brings features like arrow functions, object destructuring, functional programming methods, and more! With Rojo, you can use [roblox-ts](https://roblox-ts.com/) to compile TypeScript to Luau and take advantage of a huge ecosystem of TypeScript tooling. This project is not strictly speaking related to Rojo, but it is very cool and many people prefer to use it over writing Luau. It's also possible to use other languages that compile to Lua like [MoonScript](https://moonscript.org/) and [Haxe](https://haxe.org/) . However, there's very little development in the way of tooling for these languages, so be warned: here be dragons. * [Why Rojo?](https://rojo.space/docs/v7/#why-rojo) * [Tools](https://rojo.space/docs/v7/#tools) * [Rojo at RDC 2019](https://rojo.space/docs/v7/#rojo-at-rdc-2019) * [External Text Editors](https://rojo.space/docs/v7/#external-text-editors) * [Version Control](https://rojo.space/docs/v7/#version-control) * [TypeScript](https://rojo.space/docs/v7/#typescript) --- # Introduction | Rojo [Skip to main content](https://rojo.space/docs/v0.5/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/) ** (v7). Version: v0.5 import Content from "@site/docs/intro.md"; --- # Porting an Existing Game | Rojo [Skip to main content](https://rojo.space/docs/v0.5/getting-started/existing-game/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/existing-game/) ** (v7). Version: v0.5 On this page This document will go over some tips for porting an existing Roblox game to use Rojo. Because every game is different, this guide contains general advice and tips. Prepare Your Game[​](https://rojo.space/docs/v0.5/getting-started/existing-game/#prepare-your-game "Direct link to Prepare Your Game") --------------------------------------------------------------------------------------------------------------------------------------- Not all Roblox idioms translate to the filesystem well. If possible, it's easiest to refactor your game slightly to reduce reliance on these before introducing Rojo. Even if you don't adopt Rojo, these ideas may still improve your game's structure! ### Move Code into Fewer Places[​](https://rojo.space/docs/v0.5/getting-started/existing-game/#move-code-into-fewer-places "Direct link to Move Code into Fewer Places") Inside Roblox, it is common to have scripts stashed away in instances like GUI components, parts in the main scene, or in objects like Tools. Roblox games often also contain several copies of the same script, like old school lava bricks in an obstacle course, or the AI behavior for a zombie. Most software projects outside Roblox have a single location, like a folder named `src`, that all code goes into. By moving most of your code into services like `ReplicatedStorage`, `ServerScriptService`, and `StarterPlayer`, it becomes easier to find what you're looking for. Rewriting this code to use modern Roblox features like [CollectionService](https://developer.roblox.com/en-us/api-reference/class/CollectionService) can make it easier to understand, easier to work on, and more friendly to Rojo. [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) [​](https://rojo.space/docs/v0.5/getting-started/existing-game/#rbxlx-to-rojo "Direct link to rbxlx-to-rojo") ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- There are ongoing efforts to make porting an existing game to Rojo more automatic. Currently, the most developed tool for this is [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) . [Remodel](https://github.com/Roblox/remodel) [​](https://rojo.space/docs/v0.5/getting-started/existing-game/#remodel "Direct link to remodel") ----------------------------------------------------------------------------------------------------------------------------------------------- Another option for porting an existing game is to use [Remodel](https://github.com/Roblox/remodel) , which allows deep customization and would be suitable for porting a large, complex game. Migrating Away from Rojo[​](https://rojo.space/docs/v0.5/getting-started/existing-game/#migrating-away-from-rojo "Direct link to Migrating Away from Rojo") ------------------------------------------------------------------------------------------------------------------------------------------------------------ Migrating away from Rojo is very simple: start editing your Roblox place directly instead of the files on the filesystem! Because everything in Rojo turns into a normal Roblox place or model, you aren't locked into Rojo if you decide to try it for a small part of your game. * [Prepare Your Game](https://rojo.space/docs/v0.5/getting-started/existing-game/#prepare-your-game) * [Move Code into Fewer Places](https://rojo.space/docs/v0.5/getting-started/existing-game/#move-code-into-fewer-places) * [rbxlx-to-rojo](https://rojo.space/docs/v0.5/getting-started/existing-game/#rbxlx-to-rojo) * [Remodel](https://rojo.space/docs/v0.5/getting-started/existing-game/#remodel) * [Migrating Away from Rojo](https://rojo.space/docs/v0.5/getting-started/existing-game/#migrating-away-from-rojo) --- # Installation | Rojo [Skip to main content](https://rojo.space/docs/v0.5/getting-started/installation/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/installation/) ** (v7). Version: v0.5 On this page Installation ============ There are two supported ways to install Rojo: * VS Code * CLI If you use Visual Studio Code, you can install [the Rojo VS Code extension](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo) , which allows for both halves of Rojo to work within Visual Studio Code, with a nifty UI to sync files and start/stop the Rojo server! info The VS Code extension does not add `rojo` to your system PATH. In order to use Rojo from the terminal, you'll need to install the CLI separately. Rojo has two pieces that need to be installed: * The Server * The Roblox Studio plugin Installing the Server[​](https://rojo.space/docs/v0.5/getting-started/installation/#installing-the-server "Direct link to Installing the Server") -------------------------------------------------------------------------------------------------------------------------------------------------- * With Foreman * From GitHub * From crates.io [Foreman](https://github.com/rojo-rbx/foreman) is a toolchain manager that is useful for managing tools like Rojo for Roblox projects. To install from the latest stable release channel of Rojo 6, add an entry to the `[tools]` section of your `foreman.toml`: [tools]rojo = { source = "rojo-rbx/rojo", version = "0.5" } There are pre-built binaries available for Windows, macOS, and Linux from Rojo's [GitHub Releases page](https://github.com/LPGhatguy/rojo/releases) . The Rojo CLI must be run from the command line, like `cmd.exe` on Windows or `Terminal.app` on macOS. It's recommended that you put the Rojo CLI executable on your system `PATH` to make this easier. It's also possible to install Rojo releases using [Rust](https://www.rust-lang.org/) . This will compile Rojo from source and install it on your machine. To install Rojo 0.5, use: cargo install rojo --version ^0.5 Installing the Plugin[​](https://rojo.space/docs/v0.5/getting-started/installation/#installing-the-plugin "Direct link to Installing the Plugin") -------------------------------------------------------------------------------------------------------------------------------------------------- * From GitHub * From Roblox.com The Rojo plugin is available from Rojo's GitHub Releases page. [Rojo GitHub Releases](https://github.com/rojo-rbx/rojo/releases) info Rojo has a separate plugin for each major version. Make sure you install the correct one! Download the attached `rbxm` file and put it into your Roblox Studio plugins folder. You can find that folder by pressing **Plugins Folder** from your Plugins toolbar in Roblox Studio: !['Plugins Folder' button in Roblox Studio](https://rojo.space/assets/images/plugins-folder-in-studio-cb565553f78b7e4b38fe60a6669bbca0.png) The Rojo plugin can be installed from Roblox.com. [Rojo 0.5 Plugin on Roblox.com](https://www.roblox.com/library/1997686364/) info Rojo has a separate plugin for each major version. Make sure you install the correct one! Press the 'Install' button on the plugin page to add it to Roblox Studio. * [Installing the Server](https://rojo.space/docs/v0.5/getting-started/installation/#installing-the-server) * [Installing the Plugin](https://rojo.space/docs/v0.5/getting-started/installation/#installing-the-plugin) --- # Creating a New Game | Rojo [Skip to main content](https://rojo.space/docs/v0.5/getting-started/new-game/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/new-game/) ** (v7). Version: v0.5 On this page Creating the Rojo Project[​](https://rojo.space/docs/v0.5/getting-started/new-game/#creating-the-rojo-project "Direct link to Creating the Rojo Project") ---------------------------------------------------------------------------------------------------------------------------------------------------------- Rojo has a built-in command to initialize a new game project. * VS Code * CLI Open a new empty folder in VS Code. Your editor should look like this: ![empty VS Code project](https://rojo.space/assets/images/empty-project-0e4e7f034cfbd120d04eff0b91435d9a.png) Open your VS Code Command Palette (`ctrl+shift+P` on Windows, `cmd+shift+P` on macOS) and type `rojo init`. Run the command that pops up: ![rojo init command](https://rojo.space/assets/images/init-command-d2fcc46b50b6d23786b32131dea1e0df.png) Once it succeeds, you should see a bunch of new files: ![complete rojo project](https://rojo.space/assets/images/init-output-656bda13af34931a7797e1f6d4195dd3.png) These are all the files you need to get started with Rojo. First, open up a terminal window, like `cmd.exe` on Windows or `Terminal.app` on macOS. Navigate to where you'd like to store your new project and run rojo init my-new-game Rojo will create a folder named `my-new-game` if it doesn't already exist and create everything you need to get started. Building Your Place[​](https://rojo.space/docs/v0.5/getting-started/new-game/#building-your-place "Direct link to Building Your Place") ---------------------------------------------------------------------------------------------------------------------------------------- Now that we have a project, one thing we can do is build a Roblox place file for our project. This is a great way to get started with a project quickly with no fuss. * VS Code * CLI Open your VS Code Command Palette and type `rojo build`. You'll be prompted to select a project, choose the default one. ![rojo build command](https://rojo.space/assets/images/build-command-761b6a9baa210b594a3624e6cbcc48c7.png) All we have to do is run `rojo build` from inside the project's folder: rojo build -o build.rbxlx info To generate a binary place file instead, use `build.rbxl`. Rojo will create a file named `build.rbxlx` that contains your new game! If you open `build.rbxlx` in Roblox Studio now, you should see a baseplate, as well as code in services like `ReplicatedStorage`. Live-Syncing into Studio[​](https://rojo.space/docs/v0.5/getting-started/new-game/#live-syncing-into-studio "Direct link to Live-Syncing into Studio") ------------------------------------------------------------------------------------------------------------------------------------------------------- Building a place file is great for starting to work on a game, but for active iteration, you'll want something faster. In Roblox Studio, make sure the Rojo plugin is installed. If you need it, check out [the installation guide](https://rojo.space/docs/v0.5/getting-started/installation/) to learn how to install it. To expose your project to the plugin, you'll need to start the **live sync server**. * VS Code * CLI Open your VS Code Command Palette, type `rojo serve`, and choose the extension's command. ![rojo serve command](https://rojo.space/assets/images/serve-command-1916b5e9c9b1083735a38ae06abdac03.png) You should see a small popup in the bottom right corner of your screen with a few details. ![rojo serve output](https://rojo.space/assets/images/serve-output-8bf92a7144031516cbfbcb863bc3a29f.png) rojo serve You should see output like this in your terminal: $ rojo serveRojo server listening: Address: localhost Port: 34872Visit http://localhost:34872/ in your browser for more information Switch into Roblox Studio and press the **Rojo** plugin toolbar button. A panel should open: ![Rojo plugin connection dialog](https://rojo.space/assets/images/connect-dialog-eae33ce7b1c9f10d2a5b85891f150720.png) Press **Connect**. If all went well, you should now be able to change files in your project directory and watch them sync into Roblox Studio in real time! You can also visit the URL printed by Rojo to access extra information about the running session. Uploading Your Place[​](https://rojo.space/docs/v0.5/getting-started/new-game/#uploading-your-place "Direct link to Uploading Your Place") ------------------------------------------------------------------------------------------------------------------------------------------- Aimed at teams that want serious levels of automation, Rojo can upload places to Roblox.com automatically. You'll need an existing game on Roblox.com as well as the `.ROBLOSECURITY` cookie of an account that has write access to that game. warning It's recommended that you set up a Roblox account dedicated to deploying your game instead of your personal account in case your security cookie is compromised. Generating and publishing your game is as simple as: * VS Code * CLI Uploading places is not yet supported in the Rojo VS Code Extension. You can publish your game using Roblox Studio or use the Rojo CLI instead. rojo upload --asset_id [PLACE ID] --cookie "[SECURITY COOKIE]" If you are on Windows and have Roblox Studio installed, `--cookie` is optional and will be pulled from your Roblox Studio session if not specified. An example project is available on GitHub that deploys to Roblox.com via GitHub Actions automatically: [Desert Bus 2077](https://github.com/Roblox/desert-bus-2077) * [Creating the Rojo Project](https://rojo.space/docs/v0.5/getting-started/new-game/#creating-the-rojo-project) * [Building Your Place](https://rojo.space/docs/v0.5/getting-started/new-game/#building-your-place) * [Live-Syncing into Studio](https://rojo.space/docs/v0.5/getting-started/new-game/#live-syncing-into-studio) * [Uploading Your Place](https://rojo.space/docs/v0.5/getting-started/new-game/#uploading-your-place) --- # Help! | Rojo [Skip to main content](https://rojo.space/docs/v0.5/help/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/help/) ** (v7). Version: v0.5 Rojo is a fairly complex tool to adopt, but there's a community willing to help! The [Roblox Open Source Community Discord](https://discord.gg/wH5ncNS) currently hosts a Rojo support channel, **#rojo**, that is a great place to get help as problems come up. If you find anything that looks like a bug or have ideas for how to improve Rojo, feel free to file an issue on [Rojo's GitHub issue tracker](https://github.com/rojo-rbx/rojo/issues) . --- # Project Format | Rojo [Skip to main content](https://rojo.space/docs/v0.5/project-format/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/project-format/) ** (v7). Version: v0.5 On this page Project Format ============== Project File[​](https://rojo.space/docs/v0.5/project-format/#project-file "Direct link to Project File") --------------------------------------------------------------------------------------------------------- Rojo projects are JSON files that have the `.project.json` extension. They have the following fields: * `name`: A string indicating the name of the project. This name is used when building the project into a model or place file. * **Required** * `tree`: An [Instance Description](https://rojo.space/docs/v0.5/project-format/#instance-description) describing the root instance of the project. * **Required** * `servePort`: The port that `rojo serve` should listen on. Passing `--port` will override this setting. * **Optional** * Default is `34872` * `servePlaceIds`: A list of place IDs that this project may be live-synced to. This feature can help prevent overwriting the wrong game with source from Rojo. * **Optional** * Default is `null` * `globIgnorePaths`: A list of globs of paths to ignore. * **Optional** * Default is `[]` Instance Description[​](https://rojo.space/docs/v0.5/project-format/#instance-description "Direct link to Instance Description") --------------------------------------------------------------------------------------------------------------------------------- Instance Descriptions correspond one-to-one with the actual Roblox Instances in the project. * `$className`: The ClassName of the Instance being described. * **Required** * `$path`: The path on the filesystem to pull files from into the project. * **Optional if `$className` is specified.** * Paths are relative to the folder containing the project file. * `$properties`: Properties to apply to the instance. Values should be [Instance Property Values](https://rojo.space/docs/v0.5/project-format/#instance-property-value) . * **Optional** * `$ignoreUnknownInstances`: Whether instances that Rojo doesn't know about should be deleted. * **Optional** * Default is `false` if `$path` is specified, otherwise `true`. All other fields in an Instance Description are turned into instances whose name is the key. These values should also be Instance Descriptions! Instance Property Value[​](https://rojo.space/docs/v0.5/project-format/#instance-property-value "Direct link to Instance Property Value") ------------------------------------------------------------------------------------------------------------------------------------------ There are two kinds of property values on instances, **implicit** and **explicit**. In the vast majority of cases, you should be able to use **implicit** property values. To use them, just use a value that's the same shape as the type that the property has: "MyPart": { "$className": "Part", "$properties": { "Size": [3, 5, 3], "Color": [0.5, 0, 0.5], "Anchored": true, "Material": "Granite" }} `Vector3` and `Color3` properties can just be arrays of numbers, as can types like `Vector2`, `CFrame`, and more! Enums can be set to a string containing the enum variant. Rojo will raise an error if the string isn't a valid variant for the enum. There are some cases where this syntax for assigning properties _doesn't_ work. In these cases, Rojo requires you to use the **explicit** property syntax. Some reasons why you might need to use an **explicit** property: * Using exotic property types like `BinaryString` * Using properties added to Roblox recently that Rojo doesn't know about yet The shape of explicit property values is defined by the [rbx-dom](https://github.com/LPGhatguy/rbx-dom) library, so it uses slightly different conventions than the rest of Rojo. Each value should be an object with the following required fields: * `Type`: The type of property to represent. * [Supported types can be found here](https://github.com/LPGhatguy/rbx-tree#property-type-coverage) . * `Value`: The value of the property. * The shape of this field depends on which property type is being used. `Vector3` and `Color3` values are both represented as a list of numbers, while `BinaryString` expects a base64-encoded string, for example. Here's the same object, but with explicit properties: "MyPart": { "$className": "Part", "$properties": { "Size": { "Type": "Vector3", "Value": [3, 5, 3] }, "Color": { "Type": "Color3", "Value": [0.5, 0, 0.5] }, "Anchored": { "Type": "Bool", "Value": true }, "Material": { "Type": "Enum", "Value": 832 } }} Example Projects[​](https://rojo.space/docs/v0.5/project-format/#example-projects "Direct link to Example Projects") --------------------------------------------------------------------------------------------------------------------- This project bundles up everything in the `src` directory. It'd be suitable for making a plugin or model: { "name": "AwesomeLibrary", "tree": { "$path": "src" }} This project describes the layout you might use if you were making the next hit simulator game, _Sisyphus Simulator_: { "name": "Sisyphus Simulator", "globIgnorePaths": ["**/*.spec.lua"], "tree": { "$className": "DataModel", "HttpService": { "$className": "HttpService", "$properties": { "HttpEnabled": true } }, "ReplicatedStorage": { "$className": "ReplicatedStorage", "$path": "src/ReplicatedStorage" }, "StarterPlayer": { "$className": "StarterPlayer", "StarterPlayerScripts": { "$className": "StarterPlayerScripts", "$path": "src/StarterPlayerScripts" } }, "Workspace": { "$className": "Workspace", "$properties": { "Gravity": 67.3 }, "Terrain": { "$path": "Terrain.rbxm" } } }} * [Project File](https://rojo.space/docs/v0.5/project-format/#project-file) * [Instance Description](https://rojo.space/docs/v0.5/project-format/#instance-description) * [Instance Property Value](https://rojo.space/docs/v0.5/project-format/#instance-property-value) * [Example Projects](https://rojo.space/docs/v0.5/project-format/#example-projects) --- # Rojo Alternatives | Rojo [Skip to main content](https://rojo.space/docs/v0.5/rojo-alternatives/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/rojo-alternatives/) ** (v7). Version: v0.5 import Content from "@site/docs/rojo-alternatives.md"; --- # Fully vs Partially Managed Rojo | Rojo [Skip to main content](https://rojo.space/docs/v0.5/reference/full-vs-partial/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/) ** (v7). Version: v0.5 On this page Rojo is designed to be adopted incrementally. How much of your project Rojo manages is up to you! There are two primary categories of ways to use Rojo: _Fully Managed_, where everything is managed by Rojo, and _Partially Managed_, where Rojo only manages a slice of your project. Fully Managed[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#fully-managed "Direct link to Fully Managed") ----------------------------------------------------------------------------------------------------------------------- In a fully managed game project, Rojo controls every instance. A fully managed Rojo project can be built from scratch using `rojo build`. Fully managed projects are most practical for libraries, plugins, and simple games. Rojo's goal is to make it practical and easy for _every_ project to be fully managed, but we're not quite there yet! ### Pros[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#pros "Direct link to Pros") * Fully reproducible builds from scratch * Everything checked into version control ### Cons[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#cons "Direct link to Cons") * Without two-way sync, models have to be saved manually * This can be done with the 'Save to File...' menu in Roblox Studio * This will be solved by Two-Way Sync ([issue #164](https://github.com/LPGhatguy/rojo/issues/164) ) * Rojo can't manage everything yet * Refs are currently broken ([issue #142](https://github.com/LPGhatguy/rojo/issues/142) ) Partially Managed[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#partially-managed "Direct link to Partially Managed") ----------------------------------------------------------------------------------------------------------------------------------- In a partially managed project, Rojo only handles a slice of the game. This could be as small as a couple scripts, or as large as everything except `Workspace`! The rest of the place's content can be versioned using Team Create or checked into source control. Partially managed projects are most practical for complicated games, or games that are migrating to use Rojo. ### Pros[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#pros-1 "Direct link to Pros") * Easier to adopt gradually * Integrates with Team Create ### Cons[​](https://rojo.space/docs/v0.5/reference/full-vs-partial/#cons-1 "Direct link to Cons") * Not everything is in version control, which makes merges tougher * Rojo can't live-sync instances like Terrain, MeshPart, or CSG operations yet * Will be fixed with plugin escalation ([issue #169](https://github.com/LPGhatguy/rojo/issues/169) ) * [Fully Managed](https://rojo.space/docs/v0.5/reference/full-vs-partial/#fully-managed) * [Pros](https://rojo.space/docs/v0.5/reference/full-vs-partial/#pros) * [Cons](https://rojo.space/docs/v0.5/reference/full-vs-partial/#cons) * [Partially Managed](https://rojo.space/docs/v0.5/reference/full-vs-partial/#partially-managed) * [Pros](https://rojo.space/docs/v0.5/reference/full-vs-partial/#pros-1) * [Cons](https://rojo.space/docs/v0.5/reference/full-vs-partial/#cons-1) --- # Introduction | Rojo [Skip to main content](https://rojo.space/docs/v6/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/) ** (v7). Version: v6 On this page Welcome! Rojo is a project management tool designed to get professional resources in the hands of Roblox developers. Here, we'll teach you how to get started with Rojo. This documentation is a continual work in progress. If you find any issues, please file an issue on [the Rojo website issue tracker](https://github.com/rojo-rbx/rojo.space/issues) ! New to Rojo? Check out [Installation](https://rojo.space/docs/v6/getting-started/installation/) . Why Rojo?[​](https://rojo.space/docs/v6/#why-rojo "Direct link to Why Rojo?") ------------------------------------------------------------------------------ Adding a tool like Rojo to your Roblox workflow can be daunting, but it comes with some key advantages. ### Tools[​](https://rojo.space/docs/v6/#tools "Direct link to Tools") There are decades of excellent tools available that operate on files. With Rojo, it's possible to take advantage of any of them! Popular tools that are tailored towards Roblox or Lua in general: * [Selene](https://github.com/Kampfkarren/selene) , a static analysis tool to help you write better Lua * [StyLua](https://github.com/JohnnyMorganz/StyLua) , a formatter that helps keep your code in a consistent style * [Wally](https://github.com/UpliftGames/wally) , a package manager for Roblox projects * [Moonwave](https://github.com/UpliftGames/moonwave) , a documentation generator for Lua projects ### Rojo at RDC 2019[​](https://rojo.space/docs/v6/#rojo-at-rdc-2019 "Direct link to Rojo at RDC 2019") Nathan Riemer (Kampfkarren) gave a talk at RDC 2019 talking about some of the benefits of using a tool like Rojo. ### External Text Editors[​](https://rojo.space/docs/v6/#external-text-editors "Direct link to External Text Editors") Rojo opens the door to use the absolute best text editors in the world and their rich plugin ecosystems. Some very popular editors include [Visual Studio Code](https://code.visualstudio.com/) and [Sublime Text](https://www.sublimetext.com/) . These advanced text editors have features like multi-cursor editing, go-to symbol, multi-file regex find and replace, bookmarks and much more. Many Rojo VS Code users also use extensions like: * [vscode-rbxlua](https://marketplace.visualstudio.com/items?itemName=AmaranthineCodices.vscode-rbxlua) * [Roblox Lua Autocompletes](https://marketplace.visualstudio.com/items?itemName=Kampfkarren.roblox-lua-autofills) * [TabNine](https://tabnine.com/) ### Version Control[​](https://rojo.space/docs/v6/#version-control "Direct link to Version Control") By building your game (or just the scripts) as individual files on the filesystem, it becomes easy to start using professional-grade version control tools like [Git](https://git-scm.com/) and [GitHub](https://github.com/) . Hundreds of thousands of companies and individual developers use Git to version their software projects. With Rojo, Roblox developers can take advantage of the best collaboration tool around. Using a repository hosting service like GitHub or GitLab brings powerful features to Roblox developers like code reviews and issue tracking that professional engineers can't live without. ### TypeScript[​](https://rojo.space/docs/v6/#typescript "Direct link to TypeScript") TypeScript enables static type safety, which helps prevent typos and adds unparalleled autocompletion. It also brings features like arrow functions, object destructuring, functional programming methods, and more! With Rojo, you can use [roblox-ts](https://roblox-ts.com/) to compile TypeScript to Lua and take advantage of a huge ecosystem of TypeScript tooling. It's also possible to use other languages that compile to Lua like [MoonScript](https://moonscript.org/) and [Haxe](https://haxe.org/) . * [Why Rojo?](https://rojo.space/docs/v6/#why-rojo) * [Tools](https://rojo.space/docs/v6/#tools) * [Rojo at RDC 2019](https://rojo.space/docs/v6/#rojo-at-rdc-2019) * [External Text Editors](https://rojo.space/docs/v6/#external-text-editors) * [Version Control](https://rojo.space/docs/v6/#version-control) * [TypeScript](https://rojo.space/docs/v6/#typescript) --- # Recomended Workflows | Rojo [Skip to main content](https://rojo.space/docs/v0.5/workflows/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/workflows/) ** (v7). Version: v0.5 On this page This document aims to outline some recommended workflows for using Rojo solo and in teams. ### Development Places[​](https://rojo.space/docs/v0.5/workflows/#development-places "Direct link to Development Places") Many Roblox developers collaborate using [Team Create](https://developer.roblox.com/en-us/articles/Team-Create) . While Team Create is great for collaborative building and newer developers, it is also prone to issues. What workflow you migrate to depends on how much of your game you would like Rojo to manage. If you just want to use Rojo to manage your game's scripts, and leave everything else managed by Team Create or a similar feature, that is called **Partially Managed Rojo**. If you want to manage your entire game with Rojo and reap all of its benefits like continuous deployment and hermetic builds, that is called **Fully Managed Rojo**. Partially Managed Rojo[​](https://rojo.space/docs/v0.5/workflows/#partially-managed-rojo "Direct link to Partially Managed Rojo") ---------------------------------------------------------------------------------------------------------------------------------- Best practice is still being developed here, but it is generally recommended that each programmer on a project have their own place to work in. **TODO** Fully Managed Rojo[​](https://rojo.space/docs/v0.5/workflows/#fully-managed-rojo "Direct link to Fully Managed Rojo") ---------------------------------------------------------------------------------------------------------------------- **TODO** * [Development Places](https://rojo.space/docs/v0.5/workflows/#development-places) * [Partially Managed Rojo](https://rojo.space/docs/v0.5/workflows/#partially-managed-rojo) * [Fully Managed Rojo](https://rojo.space/docs/v0.5/workflows/#fully-managed-rojo) --- # Sync Details | Rojo [Skip to main content](https://rojo.space/docs/v0.5/sync-details/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v0.5**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/sync-details/) ** (v7). Version: v0.5 On this page Sync Details ============ This page aims to describe how Rojo turns files on the filesystem into Roblox objects. Overview[​](https://rojo.space/docs/v0.5/sync-details/#overview "Direct link to Overview") ------------------------------------------------------------------------------------------- | Concept | File Name | | --- | --- | | [Folders](https://rojo.space/docs/v0.5/sync-details/#folders) | any directory | | Server [Scripts](https://rojo.space/docs/v0.5/sync-details/#scripts) | `*.server.lua` | | Client [Scripts](https://rojo.space/docs/v0.5/sync-details/#scripts) | `*.client.lua` | | Module [Scripts](https://rojo.space/docs/v0.5/sync-details/#scripts) | `*.lua` | | XML [Models](https://rojo.space/docs/v0.5/sync-details/#models) | `*.rbxmx` | | Binary [Models](https://rojo.space/docs/v0.5/sync-details/#models) | `*.rbxm` | | [Localization Tables](https://rojo.space/docs/v0.5/sync-details/#localization-tables) | `*.csv` | | [Plain Text](https://rojo.space/docs/v0.5/sync-details/#plain-text) | `*.txt` | | [JSON Modules](https://rojo.space/docs/v0.5/sync-details/#json-modules) | `*.json` | | [JSON Models](https://rojo.space/docs/v0.5/sync-details/#json-models) | `*.model.json` | | [Projects](https://rojo.space/docs/v0.5/sync-details/#projects) | `*.project.json` | | [Meta Files](https://rojo.space/docs/v0.5/sync-details/#meta-files) | `*.meta.json` | Limitations[​](https://rojo.space/docs/v0.5/sync-details/#limitations "Direct link to Limitations") ---------------------------------------------------------------------------------------------------- Not all property types can be synced by Rojo in real-time due to limitations of the Roblox Studio plugin API. In these cases, you can usually generate a place file and open it when you start working on a project. Some common cases you might hit are: * Binary data (Terrain, CSG parts) * `MeshPart.MeshId` * `HttpService.HttpEnabled` For a list of all property types that Rojo can reason about, both when live-syncing and when building place files, look at [rbx-dom's type coverage chart](https://github.com/Roblox/rbx-dom#property-type-coverage) . This limitation may be solved by [issue #205](https://github.com/rojo-rbx/rojo/issues/205) in the future. Folders[​](https://rojo.space/docs/v0.5/sync-details/#folders "Direct link to Folders") ---------------------------------------------------------------------------------------- Any directory on the filesystem will turn into a `Folder` instance with the same name. It is possible for a directory to contain certain files that change what the directory turns into: * An `init.lua`, `init.server.lua`, or `init.client.lua` file, described in [Scripts](https://rojo.space/docs/v0.5/sync-details/#scripts) . * An `init.meta.json` file that defines `className`, described in [Meta Files](https://rojo.space/docs/v0.5/sync-details/#meta-files) . * A `default.project.json` file, described in [Projects](https://rojo.space/docs/v0.5/sync-details/#projects) . Scripts[​](https://rojo.space/docs/v0.5/sync-details/#scripts "Direct link to Scripts") ---------------------------------------------------------------------------------------- Rojo transforms any files with the `lua` extension into the various script instances that Roblox has. * Any file ending in `.server.lua` will turn into a `Script` instance. * Any file ending in `.client.lua` will turn into a `LocalScript` instance. * Any other `.lua` file will turn into a `ModuleScript` instance. Rojo reserves three special script names. These scripts change their parent directory into a script instead of a folder: * `init.server.lua` will change its parent directory into a `Script` instance. * `init.client.lua` will change its parent directory into a `LocalScript` instance. * `init.lua` will change its parent directory into a `ModuleScript` instance. For example, these files: Will turn into these instances in Roblox: Only one "init script" can be present in the same folder. Models[​](https://rojo.space/docs/v0.5/sync-details/#models "Direct link to Models") ------------------------------------------------------------------------------------- Rojo supports both binary (`.rbxm`) and XML (`.rbxmx`) models generated by Roblox Studio or another tool. Support for `rbxmx` is very good, while support for `rbxm` is still very early, buggy, and lacking features. For a rundown of supported types, check out [rbx-dom's type coverage chart](https://github.com/rojo-rbx/rbx-dom#property-type-coverage) . Localization Tables[​](https://rojo.space/docs/v0.5/sync-details/#localization-tables "Direct link to Localization Tables") ---------------------------------------------------------------------------------------------------------------------------- Any file with the `csv` extension is transformed into a `LocalizationTable` instance. Rojo expects these files to follow the same format that Roblox does when importing and exporting localization information. An example CSV localization table is: Key,Source,Context,Example,esAck,Ack!,,An exclamation of despair,¡Ay! Plain Text[​](https://rojo.space/docs/v0.5/sync-details/#plain-text "Direct link to Plain Text") ------------------------------------------------------------------------------------------------- Any file with the `txt` extension is transformed into a `StringValue` instance. This is useful for bringing in text data that can be read by scripts at runtime. JSON Modules[​](https://rojo.space/docs/v0.5/sync-details/#json-modules "Direct link to JSON Modules") ------------------------------------------------------------------------------------------------------- Any file with the `json` extension that is not a [JSON Model](https://rojo.space/docs/v0.5/sync-details/#json-models) or a [Project File](https://rojo.space/docs/v0.5/sync-details/#project-file) JSON Models[​](https://rojo.space/docs/v0.5/sync-details/#json-models "Direct link to JSON Models") ---------------------------------------------------------------------------------------------------- Files ending in `.model.json` can be used to describe simple models. They're designed to be hand-written and are useful for instances like `RemoteEvent`. A JSON model describing a folder containing a `Part` and a `RemoteEvent` could be written as a file named `My Cool Model.model.json` with: { "ClassName": "Folder", "Children": [ { "Name": "RootPart", "ClassName": "Part", "Properties": { "Size": { "Type": "Vector3", "Value": [4, 4, 4] } } }, { "Name": "SendMoney", "ClassName": "RemoteEvent" } ]} It would turn into these instances: Projects[​](https://rojo.space/docs/v0.5/sync-details/#projects "Direct link to Projects") ------------------------------------------------------------------------------------------- Starting in Rojo 6.0, project files can be included in other project files. This can be useful for reusing pieces between multiple project files. Projects that are intended to be included inside other projects should describe models, not places. If a directory contains a file named `default.project.json`, Rojo will use the contents of the project file instead of anything else in the directory. Meta Files[​](https://rojo.space/docs/v0.5/sync-details/#meta-files "Direct link to Meta Files") ------------------------------------------------------------------------------------------------- New in Rojo 0.5 are meta files, named `.meta.json`. Meta files allow attaching extra Rojo data to models defined in other formats, like Roblox's `rbxm` and `rbxmx` model formats, or even Lua scripts. This can be used to set Rojo-specific settings like `ignoreUnknownInstances`, or can be used to set properties like `Disabled` on a script. Meta files can contain: * `className`: Changes the `className` of a containing `Folder` into something else. * Usable only in `init.meta.json` files * `properties`: A map of properties to set on the instance, just like projects * Usable on anything except `.rbxmx`, `.rbxm`, and `.model.json` files, which already have properties * `ignoreUnknownInstances`: Works just like `$ignoreUnknownInstances` in project files ### Meta Files to set Rojo metadata[​](https://rojo.space/docs/v0.5/sync-details/#meta-files-to-set-rojo-metadata "Direct link to Meta Files to set Rojo metadata") Sometimes it's useful to apply properties like `ignoreUnknownInstances` on instances that are defined on the filesystem instead of within the project itself. If your project has `hello.txt` and there are instances underneath it that you want Rojo to ignore when live-syncing, you could create `hello.meta.json` with: { "ignoreUnknownInstances": true} ### Meta Files for Disabled Scripts[​](https://rojo.space/docs/v0.5/sync-details/#meta-files-for-disabled-scripts "Direct link to Meta Files for Disabled Scripts") Meta files can be used to set properties on `Script` instances, like `Disabled`. If your project has `foo.server.lua` and you want to make sure it would be disabled, you could create a `foo.meta.json` next to it with: { "properties": { "Disabled": true }} ### Meta Files for Tools[​](https://rojo.space/docs/v0.5/sync-details/#meta-files-for-tools "Direct link to Meta Files for Tools") If you wanted to represent a tool containing a script and a model for its handle, create a directory with an `init.meta.json` file in it: { "className": "Tool", "properties": { "Grip": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1] }} Instead of a `Folder` instance, you'll end up with a `Tool` instance with the `Grip` property set. * [Overview](https://rojo.space/docs/v0.5/sync-details/#overview) * [Limitations](https://rojo.space/docs/v0.5/sync-details/#limitations) * [Folders](https://rojo.space/docs/v0.5/sync-details/#folders) * [Scripts](https://rojo.space/docs/v0.5/sync-details/#scripts) * [Models](https://rojo.space/docs/v0.5/sync-details/#models) * [Localization Tables](https://rojo.space/docs/v0.5/sync-details/#localization-tables) * [Plain Text](https://rojo.space/docs/v0.5/sync-details/#plain-text) * [JSON Modules](https://rojo.space/docs/v0.5/sync-details/#json-modules) * [JSON Models](https://rojo.space/docs/v0.5/sync-details/#json-models) * [Projects](https://rojo.space/docs/v0.5/sync-details/#projects) * [Meta Files](https://rojo.space/docs/v0.5/sync-details/#meta-files) * [Meta Files to set Rojo metadata](https://rojo.space/docs/v0.5/sync-details/#meta-files-to-set-rojo-metadata) * [Meta Files for Disabled Scripts](https://rojo.space/docs/v0.5/sync-details/#meta-files-for-disabled-scripts) * [Meta Files for Tools](https://rojo.space/docs/v0.5/sync-details/#meta-files-for-tools) --- # Porting an Existing Game | Rojo [Skip to main content](https://rojo.space/docs/v6/getting-started/existing-game/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/existing-game/) ** (v7). Version: v6 On this page This document will go over some tips for porting an existing Roblox game to use Rojo. Because every game is different, this guide contains general advice and tips. Prepare Your Game[​](https://rojo.space/docs/v6/getting-started/existing-game/#prepare-your-game "Direct link to Prepare Your Game") ------------------------------------------------------------------------------------------------------------------------------------- Not all Roblox idioms translate to the filesystem well. If possible, it's easiest to refactor your game slightly to reduce reliance on these before introducing Rojo. Even if you don't adopt Rojo, these ideas may still improve your game's structure! ### Move Code into Fewer Places[​](https://rojo.space/docs/v6/getting-started/existing-game/#move-code-into-fewer-places "Direct link to Move Code into Fewer Places") Inside Roblox, it is common to have scripts stashed away in instances like GUI components, parts in the main scene, or in objects like Tools. Roblox games often also contain several copies of the same script, like old school lava bricks in an obstacle course, or the AI behavior for a zombie. Most software projects outside Roblox have a single location, like a folder named `src`, that all code goes into. By moving most of your code into services like `ReplicatedStorage`, `ServerScriptService`, and `StarterPlayer`, it becomes easier to find what you're looking for. Rewriting this code to use modern Roblox features like [CollectionService](https://developer.roblox.com/en-us/api-reference/class/CollectionService) can make it easier to understand, easier to work on, and more friendly to Rojo. [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) [​](https://rojo.space/docs/v6/getting-started/existing-game/#rbxlx-to-rojo "Direct link to rbxlx-to-rojo") ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- There are ongoing efforts to make porting an existing game to Rojo more automatic. Currently, the most developed tool for this is [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) . [Remodel](https://github.com/Roblox/remodel) [​](https://rojo.space/docs/v6/getting-started/existing-game/#remodel "Direct link to remodel") --------------------------------------------------------------------------------------------------------------------------------------------- Another option for porting an existing game is to use [Remodel](https://github.com/Roblox/remodel) , which allows deep customization and would be suitable for porting a large, complex game. Migrating Away from Rojo[​](https://rojo.space/docs/v6/getting-started/existing-game/#migrating-away-from-rojo "Direct link to Migrating Away from Rojo") ---------------------------------------------------------------------------------------------------------------------------------------------------------- Migrating away from Rojo is very simple: start editing your Roblox place directly instead of the files on the filesystem! Because everything in Rojo turns into a normal Roblox place or model, you aren't locked into Rojo if you decide to try it for a small part of your game. * [Prepare Your Game](https://rojo.space/docs/v6/getting-started/existing-game/#prepare-your-game) * [Move Code into Fewer Places](https://rojo.space/docs/v6/getting-started/existing-game/#move-code-into-fewer-places) * [rbxlx-to-rojo](https://rojo.space/docs/v6/getting-started/existing-game/#rbxlx-to-rojo) * [Remodel](https://rojo.space/docs/v6/getting-started/existing-game/#remodel) * [Migrating Away from Rojo](https://rojo.space/docs/v6/getting-started/existing-game/#migrating-away-from-rojo) --- # Installation | Rojo [Skip to main content](https://rojo.space/docs/v6/getting-started/installation/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/installation/) ** (v7). Version: v6 On this page Installation ============ There are two supported ways to install Rojo: * VS Code * CLI If you use Visual Studio Code, you can install [the Rojo VS Code extension](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo) , which allows for both halves of Rojo to work within Visual Studio Code, with a nifty UI to sync files and start/stop the Rojo server! info The VS Code extension does not add `rojo` to your system PATH. In order to use Rojo from the terminal, you'll need to install the CLI separately. Rojo has two pieces that need to be installed: * The Server * The Roblox Studio plugin Installing the Server[​](https://rojo.space/docs/v6/getting-started/installation/#installing-the-server "Direct link to Installing the Server") ------------------------------------------------------------------------------------------------------------------------------------------------ * With Foreman * From GitHub * From crates.io [Foreman](https://github.com/rojo-rbx/foreman) is a toolchain manager that is useful for managing tools like Rojo for Roblox projects. To install from the latest stable release channel of Rojo 6, add an entry to the `[tools]` section of your `foreman.toml`: [tools]rojo = { source = "rojo-rbx/rojo", version = "6" } There are pre-built binaries available for Windows, macOS, and Linux from Rojo's [GitHub Releases page](https://github.com/rojo-rbx/rojo/releases) . The Rojo CLI must be run from the command line, like `cmd.exe` on Windows or `Terminal.app` on macOS. It's recommended that you put the Rojo CLI executable on your system `PATH` to make this easier. It's also possible to install Rojo releases using [Rust](https://www.rust-lang.org/) . This will compile Rojo from source and install it on your machine. To install Rojo 6, use: cargo install rojo --version ^6 Installing the Plugin[​](https://rojo.space/docs/v6/getting-started/installation/#installing-the-plugin "Direct link to Installing the Plugin") ------------------------------------------------------------------------------------------------------------------------------------------------ * Using the CLI * From GitHub * From Roblox.com Once you've installed the Rojo server, you can use it to install or upgrade the Rojo plugin from the command line. rojo plugin install The Rojo plugin is available from Rojo's GitHub Releases page. [Rojo GitHub Releases](https://github.com/rojo-rbx/rojo/releases) info Rojo has a separate plugin for each major version. Make sure you install the correct one! Download the attached `rbxm` file and put it into your Roblox Studio plugins folder. You can find that folder by pressing **Plugins Folder** from your Plugins toolbar in Roblox Studio: !['Plugins Folder' button in Roblox Studio](https://rojo.space/assets/images/plugins-folder-in-studio-cb565553f78b7e4b38fe60a6669bbca0.png) The Rojo plugin can be installed from Roblox.com. [Rojo 6 Plugin on Roblox.com](https://www.roblox.com/library/4048317704/) info Rojo has a separate plugin for each major version. Make sure you install the correct one! Press the 'Install' button on the plugin page to add it to Roblox Studio. * [Installing the Server](https://rojo.space/docs/v6/getting-started/installation/#installing-the-server) * [Installing the Plugin](https://rojo.space/docs/v6/getting-started/installation/#installing-the-plugin) --- # Help! | Rojo [Skip to main content](https://rojo.space/docs/v6/help/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/help/) ** (v7). Version: v6 Rojo is a fairly complex tool to adopt, but there's a community willing to help! The [Roblox Open Source Community Discord](https://discord.gg/wH5ncNS) currently hosts a Rojo support channel, **#rojo**, that is a great place to get help as problems come up. If you find anything that looks like a bug or have ideas for how to improve Rojo, feel free to file an issue on [Rojo's GitHub issue tracker](https://github.com/rojo-rbx/rojo/issues) . Rojo's primary maintainer is also available on Twitter, [@LPGhatguy](https://twitter.com/LPGhatguy) . --- # Creating a New Game | Rojo [Skip to main content](https://rojo.space/docs/v6/getting-started/new-game/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/getting-started/new-game/) ** (v7). Version: v6 On this page Creating the Rojo Project[​](https://rojo.space/docs/v6/getting-started/new-game/#creating-the-rojo-project "Direct link to Creating the Rojo Project") -------------------------------------------------------------------------------------------------------------------------------------------------------- Rojo has a built-in command to initialize a new game project. * VS Code * CLI Open a new empty folder in VS Code. Your editor should look like this: ![empty VS Code project](https://rojo.space/assets/images/empty-project-0e4e7f034cfbd120d04eff0b91435d9a.png) Open your VS Code Command Palette (`ctrl+shift+P` on Windows, `cmd+shift+P` on macOS) and type `rojo init`. Run the command that pops up: ![rojo init command](https://rojo.space/assets/images/init-command-d2fcc46b50b6d23786b32131dea1e0df.png) Once it succeeds, you should see a bunch of new files: ![complete rojo project](https://rojo.space/assets/images/init-output-656bda13af34931a7797e1f6d4195dd3.png) These are all the files you need to get started with Rojo. First, open up a terminal window, like `cmd.exe` on Windows or `Terminal.app` on macOS. Navigate to where you'd like to store your new project and run rojo init my-new-game Rojo will create a folder named `my-new-game` if it doesn't already exist and create everything you need to get started. Building Your Place[​](https://rojo.space/docs/v6/getting-started/new-game/#building-your-place "Direct link to Building Your Place") -------------------------------------------------------------------------------------------------------------------------------------- Now that we have a project, one thing we can do is build a Roblox place file for our project. This is a great way to get started with a project quickly with no fuss. * VS Code * CLI Open your VS Code Command Palette and type `rojo build`. You'll be prompted to select a project, choose the default one. ![rojo build command](https://rojo.space/assets/images/build-command-761b6a9baa210b594a3624e6cbcc48c7.png) All we have to do is run `rojo build` from inside the project's folder: rojo build -o build.rbxl Rojo will create a file named `build.rbxl` that contains your new game! If you open `build.rbxl` in Roblox Studio now, you should see a baseplate, as well as code in services like `ReplicatedStorage`. Live-Syncing into Studio[​](https://rojo.space/docs/v6/getting-started/new-game/#live-syncing-into-studio "Direct link to Live-Syncing into Studio") ----------------------------------------------------------------------------------------------------------------------------------------------------- Building a place file is great for starting to work on a game, but for active iteration, you'll want something faster. In Roblox Studio, make sure the Rojo plugin is installed. If you need it, check out [the installation guide](https://rojo.space/docs/v6/getting-started/installation/) to learn how to install it. To expose your project to the plugin, you'll need to start the **live sync server**. * VS Code * CLI Open your VS Code Command Palette, type `rojo serve`, and choose the extension's command. ![rojo serve command](https://rojo.space/assets/images/serve-command-1916b5e9c9b1083735a38ae06abdac03.png) You should see a small popup in the bottom right corner of your screen with a few details. ![rojo serve output](https://rojo.space/assets/images/serve-output-8bf92a7144031516cbfbcb863bc3a29f.png) rojo serve You should see output like this in your terminal: $ rojo serveRojo server listening: Address: localhost Port: 34872Visit http://localhost:34872/ in your browser for more information Switch into Roblox Studio and press the **Rojo** plugin toolbar button. A panel should open: ![Rojo plugin connection dialog](https://rojo.space/assets/images/connect-dialog-eae33ce7b1c9f10d2a5b85891f150720.png) Press **Connect**. If all went well, you should now be able to change files in your project directory and watch them sync into Roblox Studio in real time! You can also visit the URL printed by Rojo to access extra information about the running session. Uploading Your Place[​](https://rojo.space/docs/v6/getting-started/new-game/#uploading-your-place "Direct link to Uploading Your Place") ----------------------------------------------------------------------------------------------------------------------------------------- Aimed at teams that want serious levels of automation, Rojo can upload places to Roblox.com automatically. You'll need an existing game on Roblox.com as well as the `.ROBLOSECURITY` cookie of an account that has write access to that game. warning It's recommended that you set up a Roblox account dedicated to deploying your game instead of your personal account in case your security cookie is compromised. Generating and publishing your game is as simple as: * VS Code * CLI Uploading places is not yet supported in the Rojo VS Code Extension. You can publish your game using Roblox Studio or use the Rojo CLI instead. rojo upload --asset_id [PLACE ID] --cookie "[SECURITY COOKIE]" If you are on Windows and have Roblox Studio installed, `--cookie` is optional and will be pulled from your Roblox Studio session if not specified. An example project is available on GitHub that deploys to Roblox.com via GitHub Actions automatically: [Desert Bus 2077](https://github.com/Roblox/desert-bus-2077) * [Creating the Rojo Project](https://rojo.space/docs/v6/getting-started/new-game/#creating-the-rojo-project) * [Building Your Place](https://rojo.space/docs/v6/getting-started/new-game/#building-your-place) * [Live-Syncing into Studio](https://rojo.space/docs/v6/getting-started/new-game/#live-syncing-into-studio) * [Uploading Your Place](https://rojo.space/docs/v6/getting-started/new-game/#uploading-your-place) --- # Rojo Alternatives | Rojo [Skip to main content](https://rojo.space/docs/v6/rojo-alternatives/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/rojo-alternatives/) ** (v7). Version: v6 There are a number of existing plugins for Roblox that move code from the filesystem into Roblox. Besides Rojo, you might consider: * [rbxmk by Anaminus](https://github.com/anaminus/rbxmk) * [Rofresh by Osyris](https://github.com/osyrisrblx/rofresh) * [RbxRefresh by Osyris](https://github.com/osyrisrblx/RbxRefresh) * [Studio Bridge by Vocksel](https://github.com/vocksel/studio-bridge) * [Elixir by Vocksel](https://github.com/vocksel/elixir) * [RbxSync by evaera](https://github.com/evaera/RbxSync) * [CodeSync by MemoryPenguin](https://github.com/MemoryPenguin/CodeSync) * [rbx-exteditor by MemoryPenguin](https://github.com/MemoryPenguin/rbx-exteditor) So why did I build Rojo? Each of these tools solves what is essentially the same problem from a few different angles. The goal of Rojo is to take all of the lessons and ideas learned from these projects and build a tool that can solve this problem for good. Additionally: * I think that this tool needs to be built in a compiled language without a runtime, for easy distribution and good performance. * I think that the conventions promoted by other sync plugins (`.module.lua` for modules, as well a single sync point) are sub-optimal. * I think that I have a good enough understanding of the problem to build something robust. * I think that Rojo should be able to do more than just sync code. --- # Project Format | Rojo [Skip to main content](https://rojo.space/docs/v6/project-format/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/project-format/) ** (v7). Version: v6 On this page Project Format ============== Project File[​](https://rojo.space/docs/v6/project-format/#project-file "Direct link to Project File") ------------------------------------------------------------------------------------------------------- Rojo projects are JSON files that have the `.project.json` extension. They have the following fields: * `name`: A string indicating the name of the project. This name is used when building the project into a model or place file. * **Required** * `tree`: An [Instance Description](https://rojo.space/docs/v6/project-format/#instance-description) describing the root instance of the project. * **Required** * `servePort`: The port that `rojo serve` should listen on. Passing `--port` will override this setting. * **Optional** * Default is `34872` * `servePlaceIds`: A list of place IDs that this project may be live-synced to. This feature can help prevent overwriting the wrong game with source from Rojo. * **Optional** * Default is `null` * `globIgnorePaths`: A list of globs of paths to ignore. * **Optional** * Default is `[]` Instance Description[​](https://rojo.space/docs/v6/project-format/#instance-description "Direct link to Instance Description") ------------------------------------------------------------------------------------------------------------------------------- Instance Descriptions correspond one-to-one with the actual Roblox Instances in the project. * `$className`: The ClassName of the Instance being described. * **Optional if `$path` is specified or if the instance is a Roblox service.** * `$path`: The path on the filesystem to pull files from into the project. * **Optional if `$className` is specified.** * Paths are relative to the folder containing the project file. * `$properties`: Properties to apply to the instance. Values should be [Instance Property Values](https://rojo.space/docs/v6/project-format/#instance-property-value) . * **Optional** * `$ignoreUnknownInstances`: Whether instances that Rojo doesn't know about should be deleted. * **Optional** * Default is `false` if `$path` is specified, otherwise `true`. All other fields in an Instance Description are turned into instances whose name is the key. These values should also be Instance Descriptions! Instance Property Value[​](https://rojo.space/docs/v6/project-format/#instance-property-value "Direct link to Instance Property Value") ---------------------------------------------------------------------------------------------------------------------------------------- There are two kinds of property values on instances, **implicit** and **explicit**. In the vast majority of cases, you should be able to use **implicit** property values. To use them, just use a value that's the same shape as the type that the property has: "MyPart": { "$className": "Part", "$properties": { "Size": [3, 5, 3], "Color": [0.5, 0, 0.5], "Anchored": true, "Material": "Granite" }} `Vector3` and `Color3` properties can just be arrays of numbers, as can types like `Vector2`, `CFrame`, and more! Enums can be set to a string containing the enum variant. Rojo will raise an error if the string isn't a valid variant for the enum. There are some cases where this syntax for assigning properties _doesn't_ work. In these cases, Rojo requires you to use the **explicit** property syntax. Some reasons why you might need to use an **explicit** property: * Using exotic property types like `BinaryString` * Using properties added to Roblox recently that Rojo doesn't know about yet The shape of explicit property values is defined by the [rbx-dom](https://github.com/LPGhatguy/rbx-dom) library, so it uses slightly different conventions than the rest of Rojo. Each value should be an object with the following required fields: * `Type`: The type of property to represent. * [Supported types can be found here](https://github.com/LPGhatguy/rbx-tree#property-type-coverage) . * `Value`: The value of the property. * The shape of this field depends on which property type is being used. `Vector3` and `Color3` values are both represented as a list of numbers, while `BinaryString` expects a base64-encoded string, for example. Here's the same object, but with explicit properties: "MyPart": { "$className": "Part", "$properties": { "Size": { "Type": "Vector3", "Value": [3, 5, 3] }, "Color": { "Type": "Color3", "Value": [0.5, 0, 0.5] }, "Anchored": { "Type": "Bool", "Value": true }, "Material": { "Type": "Enum", "Value": 832 } }} Example Projects[​](https://rojo.space/docs/v6/project-format/#example-projects "Direct link to Example Projects") ------------------------------------------------------------------------------------------------------------------- This project bundles up everything in the `src` directory. It'd be suitable for making a plugin or model: { "name": "AwesomeLibrary", "tree": { "$path": "src" }} This project describes the layout you might use if you were making the next hit simulator game, _Sisyphus Simulator_: { "name": "Sisyphus Simulator", "globIgnorePaths": ["**/*.spec.lua"], "tree": { "$className": "DataModel", "HttpService": { "$className": "HttpService", "$properties": { "HttpEnabled": true } }, "ReplicatedStorage": { "$className": "ReplicatedStorage", "$path": "src/ReplicatedStorage" }, "StarterPlayer": { "$className": "StarterPlayer", "StarterPlayerScripts": { "$className": "StarterPlayerScripts", "$path": "src/StarterPlayerScripts" } }, "Workspace": { "$className": "Workspace", "$properties": { "Gravity": 67.3 }, "Terrain": { "$path": "Terrain.rbxm" } } }} * [Project File](https://rojo.space/docs/v6/project-format/#project-file) * [Instance Description](https://rojo.space/docs/v6/project-format/#instance-description) * [Instance Property Value](https://rojo.space/docs/v6/project-format/#instance-property-value) * [Example Projects](https://rojo.space/docs/v6/project-format/#example-projects) --- # Recomended Workflows | Rojo [Skip to main content](https://rojo.space/docs/v6/workflows/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/workflows/) ** (v7). Version: v6 On this page This document aims to outline some recommended workflows for using Rojo solo and in teams. ### Development Places[​](https://rojo.space/docs/v6/workflows/#development-places "Direct link to Development Places") Many Roblox developers collaborate using [Team Create](https://developer.roblox.com/en-us/articles/Team-Create) . While Team Create is great for collaborative building and newer developers, it is also prone to issues. What workflow you migrate to depends on how much of your game you would like Rojo to manage. If you just want to use Rojo to manage your game's scripts, and leave everything else managed by Team Create or a similar feature, that is called **Partially Managed Rojo**. If you want to manage your entire game with Rojo and reap all of its benefits like continuous deployment and hermetic builds, that is called **Fully Managed Rojo**. Partially Managed Rojo[​](https://rojo.space/docs/v6/workflows/#partially-managed-rojo "Direct link to Partially Managed Rojo") -------------------------------------------------------------------------------------------------------------------------------- Best practice is still being developed here, but it is generally recommended that each programmer on a project have their own place to work in. **TODO** Fully Managed Rojo[​](https://rojo.space/docs/v6/workflows/#fully-managed-rojo "Direct link to Fully Managed Rojo") -------------------------------------------------------------------------------------------------------------------- **TODO** * [Development Places](https://rojo.space/docs/v6/workflows/#development-places) * [Partially Managed Rojo](https://rojo.space/docs/v6/workflows/#partially-managed-rojo) * [Fully Managed Rojo](https://rojo.space/docs/v6/workflows/#fully-managed-rojo) --- # Sync Details | Rojo [Skip to main content](https://rojo.space/docs/v6/sync-details/#__docusaurus_skipToContent_fallback) This is documentation for Rojo **v6**, which is no longer actively maintained. For up-to-date documentation, see the **[latest version](https://rojo.space/docs/v7/sync-details/) ** (v7). Version: v6 On this page Sync Details ============ This page aims to describe how Rojo turns files on the filesystem into Roblox objects. Overview[​](https://rojo.space/docs/v6/sync-details/#overview "Direct link to Overview") ----------------------------------------------------------------------------------------- | Concept | File Name | | --- | --- | | [Folders](https://rojo.space/docs/v6/sync-details/#folders) | any directory | | Server [Scripts](https://rojo.space/docs/v6/sync-details/#scripts) | `*.server.lua` | | Client [Scripts](https://rojo.space/docs/v6/sync-details/#scripts) | `*.client.lua` | | Module [Scripts](https://rojo.space/docs/v6/sync-details/#scripts) | `*.lua` | | XML [Models](https://rojo.space/docs/v6/sync-details/#models) | `*.rbxmx` | | Binary [Models](https://rojo.space/docs/v6/sync-details/#models) | `*.rbxm` | | [Localization Tables](https://rojo.space/docs/v6/sync-details/#localization-tables) | `*.csv` | | [Plain Text](https://rojo.space/docs/v6/sync-details/#plain-text) | `*.txt` | | [JSON Modules](https://rojo.space/docs/v6/sync-details/#json-modules) | `*.json` | | [JSON Models](https://rojo.space/docs/v6/sync-details/#json-models) | `*.model.json` | | [Projects](https://rojo.space/docs/v6/sync-details/#projects) | `*.project.json` | | [Meta Files](https://rojo.space/docs/v6/sync-details/#meta-files) | `*.meta.json` | Limitations[​](https://rojo.space/docs/v6/sync-details/#limitations "Direct link to Limitations") -------------------------------------------------------------------------------------------------- Not all property types can be synced by Rojo in real-time due to limitations of the Roblox Studio plugin API. In these cases, you can usually generate a place file and open it when you start working on a project. Some common cases you might hit are: * Binary data (Terrain, CSG parts) * `MeshPart.MeshId` * `HttpService.HttpEnabled` For a list of all property types that Rojo can reason about, both when live-syncing and when building place files, look at [rbx-dom's type coverage chart](https://github.com/Roblox/rbx-dom#property-type-coverage) . This limitation may be solved by [issue #205](https://github.com/rojo-rbx/rojo/issues/205) in the future. Folders[​](https://rojo.space/docs/v6/sync-details/#folders "Direct link to Folders") -------------------------------------------------------------------------------------- Any directory on the filesystem will turn into a `Folder` instance with the same name. It is possible for a directory to contain certain files that change what the directory turns into: * An `init.lua`, `init.server.lua`, or `init.client.lua` file, described in [Scripts](https://rojo.space/docs/v6/sync-details/#scripts) . * An `init.meta.json` file that defines `className`, described in [Meta Files](https://rojo.space/docs/v6/sync-details/#meta-files) . * A `default.project.json` file, described in [Projects](https://rojo.space/docs/v6/sync-details/#projects) . Scripts[​](https://rojo.space/docs/v6/sync-details/#scripts "Direct link to Scripts") -------------------------------------------------------------------------------------- Rojo transforms any files with the `lua` extension into the various script instances that Roblox has. * Any file ending in `.server.lua` will turn into a `Script` instance. * Any file ending in `.client.lua` will turn into a `LocalScript` instance. * Any other `.lua` file will turn into a `ModuleScript` instance. Rojo reserves three special script names. These scripts change their parent directory into a script instead of a folder: * `init.server.lua` will change its parent directory into a `Script` instance. * `init.client.lua` will change its parent directory into a `LocalScript` instance. * `init.lua` will change its parent directory into a `ModuleScript` instance. For example, these files: Will turn into these instances in Roblox: Only one "init script" can be present in the same folder. Models[​](https://rojo.space/docs/v6/sync-details/#models "Direct link to Models") ----------------------------------------------------------------------------------- Rojo supports both binary (`.rbxm`) and XML (`.rbxmx`) models generated by Roblox Studio or another tool. Support for `rbxmx` is very good, while support for `rbxm` is still very early, buggy, and lacking features. For a rundown of supported types, check out [rbx-dom's type coverage chart](https://github.com/rojo-rbx/rbx-dom#property-type-coverage) . Localization Tables[​](https://rojo.space/docs/v6/sync-details/#localization-tables "Direct link to Localization Tables") -------------------------------------------------------------------------------------------------------------------------- Any file with the `csv` extension is transformed into a `LocalizationTable` instance. Rojo expects these files to follow the same format that Roblox does when importing and exporting localization information. An example CSV localization table is: Key,Source,Context,Example,esAck,Ack!,,An exclamation of despair,¡Ay! Plain Text[​](https://rojo.space/docs/v6/sync-details/#plain-text "Direct link to Plain Text") ----------------------------------------------------------------------------------------------- Any file with the `txt` extension is transformed into a `StringValue` instance. This is useful for bringing in text data that can be read by scripts at runtime. JSON Modules[​](https://rojo.space/docs/v6/sync-details/#json-modules "Direct link to JSON Modules") ----------------------------------------------------------------------------------------------------- Any file with the `json` extension that is not a [JSON Model](https://rojo.space/docs/v6/sync-details/#json-models) or a [Project File](https://rojo.space/docs/v6/sync-details/#project-file) JSON Models[​](https://rojo.space/docs/v6/sync-details/#json-models "Direct link to JSON Models") -------------------------------------------------------------------------------------------------- Files ending in `.model.json` can be used to describe simple models. They're designed to be hand-written and are useful for instances like `RemoteEvent`. A JSON model describing a folder containing a `Part` and a `RemoteEvent` could be written as a file named `My Cool Model.model.json` with: { "ClassName": "Folder", "Children": [ { "Name": "RootPart", "ClassName": "Part", "Properties": { "Size": { "Type": "Vector3", "Value": [4, 4, 4] } } }, { "Name": "SendMoney", "ClassName": "RemoteEvent" } ]} It would turn into these instances: Projects[​](https://rojo.space/docs/v6/sync-details/#projects "Direct link to Projects") ----------------------------------------------------------------------------------------- Starting in Rojo 6.0, project files can be included in other project files. This can be useful for reusing pieces between multiple project files. Projects that are intended to be included inside other projects should describe models, not places. If a directory contains a file named `default.project.json`, Rojo will use the contents of the project file instead of anything else in the directory. Meta Files[​](https://rojo.space/docs/v6/sync-details/#meta-files "Direct link to Meta Files") ----------------------------------------------------------------------------------------------- New in Rojo 0.5 are meta files, named `.meta.json`. Meta files allow attaching extra Rojo data to models defined in other formats, like Roblox's `rbxm` and `rbxmx` model formats, or even Lua scripts. This can be used to set Rojo-specific settings like `ignoreUnknownInstances`, or can be used to set properties like `Disabled` on a script. Meta files can contain: * `className`: Changes the `className` of a containing `Folder` into something else. * Usable only in `init.meta.json` files * `properties`: A map of properties to set on the instance, just like projects * Usable on anything except `.rbxmx`, `.rbxm`, and `.model.json` files, which already have properties * `ignoreUnknownInstances`: Works just like `$ignoreUnknownInstances` in project files ### Meta Files to set Rojo metadata[​](https://rojo.space/docs/v6/sync-details/#meta-files-to-set-rojo-metadata "Direct link to Meta Files to set Rojo metadata") Sometimes it's useful to apply properties like `ignoreUnknownInstances` on instances that are defined on the filesystem instead of within the project itself. If your project has `hello.txt` and there are instances underneath it that you want Rojo to ignore when live-syncing, you could create `hello.meta.json` with: { "ignoreUnknownInstances": true} ### Meta Files for Disabled Scripts[​](https://rojo.space/docs/v6/sync-details/#meta-files-for-disabled-scripts "Direct link to Meta Files for Disabled Scripts") Meta files can be used to set properties on `Script` instances, like `Disabled`. If your project has `foo.server.lua` and you want to make sure it would be disabled, you could create a `foo.meta.json` next to it with: { "properties": { "Disabled": true }} ### Meta Files for Tools[​](https://rojo.space/docs/v6/sync-details/#meta-files-for-tools "Direct link to Meta Files for Tools") If you wanted to represent a tool containing a script and a model for its handle, create a directory with an `init.meta.json` file in it: { "className": "Tool", "properties": { "Grip": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1] }} Instead of a `Folder` instance, you'll end up with a `Tool` instance with the `Grip` property set. * [Overview](https://rojo.space/docs/v6/sync-details/#overview) * [Limitations](https://rojo.space/docs/v6/sync-details/#limitations) * [Folders](https://rojo.space/docs/v6/sync-details/#folders) * [Scripts](https://rojo.space/docs/v6/sync-details/#scripts) * [Models](https://rojo.space/docs/v6/sync-details/#models) * [Localization Tables](https://rojo.space/docs/v6/sync-details/#localization-tables) * [Plain Text](https://rojo.space/docs/v6/sync-details/#plain-text) * [JSON Modules](https://rojo.space/docs/v6/sync-details/#json-modules) * [JSON Models](https://rojo.space/docs/v6/sync-details/#json-models) * [Projects](https://rojo.space/docs/v6/sync-details/#projects) * [Meta Files](https://rojo.space/docs/v6/sync-details/#meta-files) * [Meta Files to set Rojo metadata](https://rojo.space/docs/v6/sync-details/#meta-files-to-set-rojo-metadata) * [Meta Files for Disabled Scripts](https://rojo.space/docs/v6/sync-details/#meta-files-for-disabled-scripts) * [Meta Files for Tools](https://rojo.space/docs/v6/sync-details/#meta-files-for-tools) --- # Porting an Existing Game | Rojo [Skip to main content](https://rojo.space/docs/v7/getting-started/existing-game/#__docusaurus_skipToContent_fallback) Version: v7 On this page This document will go over some tips for porting an existing Roblox game to use Rojo. Because every game is different, this guide contains general advice and tips. Prepare Your Game[​](https://rojo.space/docs/v7/getting-started/existing-game/#prepare-your-game "Direct link to Prepare Your Game") ------------------------------------------------------------------------------------------------------------------------------------- Not all Roblox idioms translate to the filesystem well. If possible, it's easiest to refactor your game slightly to reduce reliance on these before introducing Rojo. Even if you don't adopt Rojo, these ideas may still improve your game's structure! ### Move Code into Fewer Places[​](https://rojo.space/docs/v7/getting-started/existing-game/#move-code-into-fewer-places "Direct link to Move Code into Fewer Places") Inside Roblox, it is common to have scripts stashed away in instances like GUI components, parts in the main scene, or in objects like Tools. Roblox games often also contain several copies of the same script, like old school lava bricks in an obstacle course, or the AI behavior for a zombie. Most software projects outside Roblox have a single location, like a folder named `src`, that all code goes into. By moving most of your code into services like `ReplicatedStorage`, `ServerScriptService`, and `StarterPlayer`, it becomes easier to find what you're looking for. Rewriting this code to use modern Roblox features like [CollectionService](https://developer.roblox.com/en-us/api-reference/class/CollectionService) can make it easier to understand, easier to work on, and more friendly to Rojo. [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) [​](https://rojo.space/docs/v7/getting-started/existing-game/#rbxlx-to-rojo "Direct link to rbxlx-to-rojo") ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- There are ongoing efforts to make porting an existing game to Rojo more automatic. Currently, the most developed tool for this is [rbxlx-to-rojo](https://github.com/rojo-rbx/rbxlx-to-rojo) . [Lune](https://github.com/lune-org/lune) [​](https://rojo.space/docs/v7/getting-started/existing-game/#lune "Direct link to lune") ----------------------------------------------------------------------------------------------------------------------------------- Another option for porting an existing game is to use [Lune](https://github.com/lune-org/lune) , which allows deep customization and would be suitable for porting a large, complex game. Migrating Away from Rojo[​](https://rojo.space/docs/v7/getting-started/existing-game/#migrating-away-from-rojo "Direct link to Migrating Away from Rojo") ---------------------------------------------------------------------------------------------------------------------------------------------------------- Migrating away from Rojo is very simple: start editing your Roblox place directly instead of the files on the filesystem! Because everything in Rojo turns into a normal Roblox place or model, you aren't locked into Rojo if you decide to try it for a small part of your game. * [Prepare Your Game](https://rojo.space/docs/v7/getting-started/existing-game/#prepare-your-game) * [Move Code into Fewer Places](https://rojo.space/docs/v7/getting-started/existing-game/#move-code-into-fewer-places) * [rbxlx-to-rojo](https://rojo.space/docs/v7/getting-started/existing-game/#rbxlx-to-rojo) * [Lune](https://rojo.space/docs/v7/getting-started/existing-game/#lune) * [Migrating Away from Rojo](https://rojo.space/docs/v7/getting-started/existing-game/#migrating-away-from-rojo) --- # Installation | Rojo [Skip to main content](https://rojo.space/docs/v7/getting-started/installation/#__docusaurus_skipToContent_fallback) Version: v7 On this page Installation ============ There are two supported ways to install Rojo: * VS Code * CLI If you use Visual Studio Code, you can install [the Rojo VS Code extension](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo) , which allows for both halves of Rojo to work within Visual Studio Code, with a nifty UI to sync files and start/stop the Rojo server! info The VS Code extension does not add `rojo` to your system PATH. In order to use Rojo from the terminal, you'll need to install the CLI separately. Rojo has two pieces that need to be installed: * The Server * The Roblox Studio plugin Installing the Server[​](https://rojo.space/docs/v7/getting-started/installation/#installing-the-server "Direct link to Installing the Server") ------------------------------------------------------------------------------------------------------------------------------------------------ * With Aftman * From GitHub * From crates.io [Aftman](https://github.com/LPGhatguy/aftman) is a toolchain manager that is useful for managing tools like Rojo for Roblox projects. To install it, follow these [instructions](https://github.com/LPGhatguy/aftman#installation) . To install the latest release of Rojo, run the following commands: aftman add rojo-rbx/rojoaftman install There are pre-built binaries available for Windows, macOS, and Linux from Rojo's [GitHub Releases page](https://github.com/rojo-rbx/rojo/releases) . The Rojo CLI must be run from the command line, like `cmd.exe` on Windows or `Terminal.app` on macOS. It's recommended that you put the Rojo CLI executable on your system `PATH` to make this easier. It's also possible to install Rojo releases using [Rust](https://www.rust-lang.org/) . This will compile Rojo from source and install it on your machine. To install Rojo 7, use: cargo install rojo --version ^7 Installing the Plugin[​](https://rojo.space/docs/v7/getting-started/installation/#installing-the-plugin "Direct link to Installing the Plugin") ------------------------------------------------------------------------------------------------------------------------------------------------ * Using the CLI * From GitHub * From Roblox.com Once you've installed the Rojo server, you can use it to install or upgrade the Rojo plugin from the command line. rojo plugin install The Rojo plugin is available from Rojo's GitHub Releases page. [Rojo GitHub Releases](https://github.com/rojo-rbx/rojo/releases) info Rojo has a separate plugin for each major version. Make sure you install the correct one! Download the attached `rbxm` file and put it into your Roblox Studio plugins folder. You can find that folder by pressing **Plugins Folder** from your Plugins toolbar in Roblox Studio: !['Plugins Folder' button in Roblox Studio](https://rojo.space/assets/images/plugins-folder-in-studio-cb565553f78b7e4b38fe60a6669bbca0.png) The Rojo plugin can be installed from Roblox.com. [Rojo 7 Plugin on Roblox.com](https://www.roblox.com/library/13916111004/Rojo) Press the 'Install' button on the plugin page to add it to Roblox Studio. * [Installing the Server](https://rojo.space/docs/v7/getting-started/installation/#installing-the-server) * [Installing the Plugin](https://rojo.space/docs/v7/getting-started/installation/#installing-the-plugin) --- # Help! | Rojo [Skip to main content](https://rojo.space/docs/v7/help/#__docusaurus_skipToContent_fallback) Version: v7 Rojo is a fairly complex tool to adopt, but there's a community willing to help! The [Roblox Open Source Community Discord](https://discord.gg/wH5ncNS) currently hosts a Rojo support channel, **#rojo**, that is a great place to get help as problems come up. If you find anything that looks like a bug or have ideas for how to improve Rojo, feel free to file an issue on [Rojo's GitHub issue tracker](https://github.com/rojo-rbx/rojo/issues) . --- # Creating a New Game | Rojo [Skip to main content](https://rojo.space/docs/v7/getting-started/new-game/#__docusaurus_skipToContent_fallback) Version: v7 On this page Creating the Rojo Project[​](https://rojo.space/docs/v7/getting-started/new-game/#creating-the-rojo-project "Direct link to Creating the Rojo Project") -------------------------------------------------------------------------------------------------------------------------------------------------------- Rojo has a built-in command to initialize a new game project. * VS Code * CLI Open a new empty folder in VS Code. Your editor should look like this: ![empty VS Code project](https://rojo.space/assets/images/empty-project-0e4e7f034cfbd120d04eff0b91435d9a.png) Open your VS Code Command Palette (`ctrl+shift+P` on Windows, `cmd+shift+P` on macOS) and type `Rojo: Open Menu`. Run the command that pops up: ![rojo init command](https://rojo.space/assets/images/init-command-d2fcc46b50b6d23786b32131dea1e0df.png) Select `Create one now` from menu to initialize Rojo project ![rojo initialize from menu](data:image/png;base64,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) Once it succeeds, you should see a bunch of new files: ![complete rojo project](https://rojo.space/assets/images/init-output-656bda13af34931a7797e1f6d4195dd3.png) These are all the files you need to get started with Rojo. First, open up a terminal window, like `cmd.exe` on Windows or `Terminal.app` on macOS. Navigate to where you'd like to store your new project and run rojo init my-new-game Rojo will create a folder named `my-new-game` if it doesn't already exist and create everything you need to get started. Building Your Place[​](https://rojo.space/docs/v7/getting-started/new-game/#building-your-place "Direct link to Building Your Place") -------------------------------------------------------------------------------------------------------------------------------------- Now that we have a project, one thing we can do is build a Roblox place file for our project. This is a great way to get started with a project quickly with no fuss. * VS Code * CLI Open your VS Code Command Palette (`ctrl+shift+P` on Windows, `cmd+shift+P` on macOS) and type `Rojo: Open Menu`. Run the command that pops up: ![rojo init command](https://rojo.space/assets/images/init-command-d2fcc46b50b6d23786b32131dea1e0df.png) Click the `Build project` button. ![rojo build from menu](https://rojo.space/assets/images/build-command-761b6a9baa210b594a3624e6cbcc48c7.png) All we have to do is run `rojo build` from inside the project's folder: rojo build -o build.rbxlx info To generate a binary place file instead, use `build.rbxl`. Rojo will create a file named `build.rbxlx` that contains your new game! If you open `build.rbxlx` in Roblox Studio now, you should see a baseplate, as well as code in services like `ReplicatedStorage`. Live-Syncing into Studio[​](https://rojo.space/docs/v7/getting-started/new-game/#live-syncing-into-studio "Direct link to Live-Syncing into Studio") ----------------------------------------------------------------------------------------------------------------------------------------------------- Building a place file is great for starting to work on a game, but for active iteration, you'll want something faster. In Roblox Studio, make sure the Rojo plugin is installed. If you need it, check out [the installation guide](https://rojo.space/docs/v7/getting-started/installation/) to learn how to install it. To expose your project to the plugin, you'll need to start the **live sync server**. * VS Code * CLI Open your VS Code Command Palette (`ctrl+shift+P` on Windows, `cmd+shift+P` on macOS) and type `Rojo: Open Menu`. Run the command that pops up: ![rojo init command](https://rojo.space/assets/images/init-command-d2fcc46b50b6d23786b32131dea1e0df.png) Click the project button from Projects in this workspace section ![rojo serve command](https://rojo.space/assets/images/serve-command-1916b5e9c9b1083735a38ae06abdac03.png) You should see a small popup in the bottom right corner of your screen with a few details. ![rojo serve output](https://rojo.space/assets/images/serve-output-8bf92a7144031516cbfbcb863bc3a29f.png) rojo serve You should see output like this in your terminal: $ rojo serveRojo server listening: Address: localhost Port: 34872Visit http://localhost:34872/ in your browser for more information Switch into Roblox Studio and press the **Rojo** plugin toolbar button. A panel should open: ![Rojo plugin connection dialog](https://rojo.space/assets/images/connect-dialog-eae33ce7b1c9f10d2a5b85891f150720.png) Press **Connect**. If all went well, you should now be able to change files in your project directory and watch them sync into Roblox Studio in real time! You can also visit the URL printed by Rojo to access extra information about the running session. Uploading Your Place[​](https://rojo.space/docs/v7/getting-started/new-game/#uploading-your-place "Direct link to Uploading Your Place") ----------------------------------------------------------------------------------------------------------------------------------------- Aimed at teams that want serious levels of automation, Rojo can upload places to Roblox.com automatically. You'll need an existing game on Roblox.com as well as the `.ROBLOSECURITY` cookie of an account that has write access to that game. warning It's recommended that you set up a Roblox account dedicated to deploying your game instead of your personal account in case your security cookie is compromised. Generating and publishing your game is as simple as: * VS Code * CLI Uploading places is not yet supported in the Rojo VS Code Extension. You can publish your game using Roblox Studio or use the Rojo CLI instead. rojo upload --asset_id [PLACE ID] --cookie "[SECURITY COOKIE]" If you are on Windows and have Roblox Studio installed, `--cookie` is optional and will be pulled from your Roblox Studio session if not specified. An example project is available on GitHub that deploys to Roblox.com via GitHub Actions automatically: [Desert Bus 2077](https://github.com/Roblox/desert-bus-2077) * [Creating the Rojo Project](https://rojo.space/docs/v7/getting-started/new-game/#creating-the-rojo-project) * [Building Your Place](https://rojo.space/docs/v7/getting-started/new-game/#building-your-place) * [Live-Syncing into Studio](https://rojo.space/docs/v7/getting-started/new-game/#live-syncing-into-studio) * [Uploading Your Place](https://rojo.space/docs/v7/getting-started/new-game/#uploading-your-place) --- # Rojo Alternatives | Rojo [Skip to main content](https://rojo.space/docs/v7/rojo-alternatives/#__docusaurus_skipToContent_fallback) Version: v7 On this page When Rojo was first produced, there were several competing standards for getting external code and models into Roblox. This page initially stood as an explanation of why Rojo was made and linked to several other options. In the intervening years, the number of alternatives has dramatically reduced. All but one of the tools that _were_ on this page have been deprecated or are otherwise unmaintained. Rojo is the de-facto standard for Roblox file syncing and has few serious alternatives. Nonetheless, the remaining alternatives are documented and presented here to provide a full picture. Keep in mind that none of the tools listed on this page are maintained or audited by Rojo's maintainers so your mileage may vary. Additionally, not every tool listed here replaces _all_ of Rojo's functionality. * [Lune](https://github.com/lune-org/lune/) * [rbxmk by Anaminus](https://github.com/anaminus/rbxmk) * [Argon by DervexDev](https://github.com/argon-rbx/argon) * [Lync by Iron Stag Games](https://github.com/Iron-Stag-Games/Lync) Why Not Rojo?[​](https://rojo.space/docs/v7/rojo-alternatives/#why-not-rojo "Direct link to Why Not Rojo?") ------------------------------------------------------------------------------------------------------------ The obvious question to ask is 'why would I use something else?' and it has an easy answer. If all you need to do is sync files into Roblox Studio, you absolutely don't need to use something other than Rojo. It is designed to be a one stop shop for syncing. However, Rojo is limited in scope and design: it doesn't allow complex scripting like Lune or rbxmk do, and it has different restrictions on its design than Argon and Lync. You should look into whether you need or want any of the features those tools have to offer and make the judgement call on your own. That said, there is special attention for Lune and rbxmk. A common workflow is to build a Rojo project into a `rbxl` or `rbxm` file and then perform post-processing using one of these tools, as their Luau runtimes enable workflows that Rojo alone does not. Most workflows don't need these, but if you have a need it'll make itself obvious. * [Why Not Rojo?](https://rojo.space/docs/v7/rojo-alternatives/#why-not-rojo) --- # Project Format | Rojo [Skip to main content](https://rojo.space/docs/v7/project-format/#__docusaurus_skipToContent_fallback) Version: v7 On this page Project File[​](https://rojo.space/docs/v7/project-format/#project-file "Direct link to Project File") ------------------------------------------------------------------------------------------------------- Rojo projects are JSON files that have the `.project.json` extension. They have the following fields: * `name`: A string indicating the name of the project. This name is used when building the project into a model or place file. * **Required** * `tree`: An [Instance Description](https://rojo.space/docs/v7/project-format/#instance-description) describing the root instance of the project. * **Required** * `servePort`: The port that `rojo serve` should listen on. Passing `--port` will override this setting. * **Optional** * Default is `34872` * `servePlaceIds`: A list of place IDs that this project may be live-synced to. This feature can help prevent overwriting the wrong game with source from Rojo. * **Optional** * Default is `null` * `placeId`: Sets the current place's place ID when connecting to the Rojo server from Roblox Studio. * **Optional** * Default is `null` * `gameId`: Sets the current place's game ID when connecting to the Rojo server from Roblox Studio. * **Optional** * Default is `null` * `serveAddress`: If specified, this address will be used in place of the default address, as long as --address is unprovided. * **Optional** * Default is `null` * `globIgnorePaths`: A list of globs of paths to ignore. * **Optional** * Default is `[]` * `emitLegacyScripts`: A boolean specifying whether Rojo should use both `Script` and `LocalScript` Instances instead of just `Script` Instances with their [`RunContext`](https://create.roblox.com/docs/reference/engine/classes/BaseScript#RunContext) set. * **Optional** * Default is `true` Instance Description[​](https://rojo.space/docs/v7/project-format/#instance-description "Direct link to Instance Description") ------------------------------------------------------------------------------------------------------------------------------- Instance Descriptions correspond one-to-one with the actual Roblox Instances in the project. * `$className`: The ClassName of the Instance being described. * **Optional if `$path` is specified or if the instance is a Roblox service.** * `$path`: The path on the filesystem to pull files from into the project. * **Optional if `$className` is specified.** * Paths are relative to the folder containing the project file. * `$properties`: Properties to apply to the instance. Values should be [Instance Property Values](https://rojo.space/docs/v7/project-format/#instance-property-value) . * **Optional** * `$ignoreUnknownInstances`: Whether instances that Rojo doesn't know about should be deleted. * **Optional** * Default is `false` if `$path` is specified, otherwise `true`. All other fields in an Instance Description are turned into instances whose name is the key. These values should also be Instance Descriptions! Instance Property Value[​](https://rojo.space/docs/v7/project-format/#instance-property-value "Direct link to Instance Property Value") ---------------------------------------------------------------------------------------------------------------------------------------- There are two kinds of property values on instances, **implicit** and **explicit**. An implicit value uses Rojo's knowledge of Roblox's API to infer the correct type, while an explicit value specifies the type directly. When a value is specified implicitly, Rojo uses the class name and property name to validate the value. That is, the format of an implicit value must be correct for the type corresponding to the class and property. For example, the `Anchored` property of the `Part` class is known by Rojo to be of the [Bool](https://rojo.space/docs/v7/properties/#bool) type, so the implicit value must be a boolean: { "$className": "Part", "$properties": { "Anchored": true, }} Conversely, an explicit value specifies the type of the value directly. An explicit value is an object with one field, where: * The key of the field is the [type](https://rojo.space/docs/v7/properties/#property-type-support) of property to represent. * The value of the field is the value of the property, in the format of the specified type. For example, the `Anchored` property specified explicitly: { "$className": "Part", "$properties": { "Anchored": { "Bool": true }, }} For explicit values, Rojo _does not_ validate the type against Roblox's API. For example, the type of the `Anchored` property could be overridden to be a string instead: { "$className": "Part", "$properties": { "Anchored": { "String": "Hello, world!" }, }} Explicit values are necessary for properties that Rojo does not know about. This includes properties that have been recently added to Roblox's API, and certain internal properties that aren't described by Roblox's API at all. The [Properties](https://rojo.space/docs/v7/properties/) page describes the formats of each type in detail. Example Projects[​](https://rojo.space/docs/v7/project-format/#example-projects "Direct link to Example Projects") ------------------------------------------------------------------------------------------------------------------- This project bundles up everything in the `src` directory. It'd be suitable for making a plugin or model: { "name": "AwesomeLibrary", "tree": { "$path": "src" }} This project describes the layout you might use if you were making the next hit simulator game, _Sisyphus Simulator_: { "name": "Sisyphus Simulator", "globIgnorePaths": ["**/*.spec.lua"], "tree": { "$className": "DataModel", "HttpService": { "$className": "HttpService", "$properties": { "HttpEnabled": true } }, "ReplicatedStorage": { "$className": "ReplicatedStorage", "$path": "src/ReplicatedStorage" }, "StarterPlayer": { "$className": "StarterPlayer", "StarterPlayerScripts": { "$className": "StarterPlayerScripts", "$path": "src/StarterPlayerScripts" } }, "Workspace": { "$className": "Workspace", "$properties": { "Gravity": 67.3 }, "Terrain": { "$path": "Terrain.rbxm" } } }} * [Project File](https://rojo.space/docs/v7/project-format/#project-file) * [Instance Description](https://rojo.space/docs/v7/project-format/#instance-description) * [Instance Property Value](https://rojo.space/docs/v7/project-format/#instance-property-value) * [Example Projects](https://rojo.space/docs/v7/project-format/#example-projects) --- # Recommended Workflows | Rojo [Skip to main content](https://rojo.space/docs/v7/workflows/#__docusaurus_skipToContent_fallback) Version: v7 On this page This document aims to outline some recommended workflows for using Rojo solo and in teams. ### Development Places[​](https://rojo.space/docs/v7/workflows/#development-places "Direct link to Development Places") Many Roblox developers collaborate using [Team Create](https://developer.roblox.com/en-us/articles/Team-Create) . While Team Create is great for collaborative building and newer developers, it is also prone to issues. What workflow you migrate to depends on how much of your game you would like Rojo to manage. If you just want to use Rojo to manage your game's scripts, and leave everything else managed by Team Create or a similar feature, that is called **Partially Managed Rojo**. If you want to manage your entire game with Rojo and reap all of its benefits like continuous deployment and hermetic builds, that is called **Fully Managed Rojo**. Partially Managed Rojo[​](https://rojo.space/docs/v7/workflows/#partially-managed-rojo "Direct link to Partially Managed Rojo") -------------------------------------------------------------------------------------------------------------------------------- Best practice is still being developed here, but it is generally recommended that each programmer on a project have their own place to work in. **TODO** Fully Managed Rojo[​](https://rojo.space/docs/v7/workflows/#fully-managed-rojo "Direct link to Fully Managed Rojo") -------------------------------------------------------------------------------------------------------------------- **TODO** * [Development Places](https://rojo.space/docs/v7/workflows/#development-places) * [Partially Managed Rojo](https://rojo.space/docs/v7/workflows/#partially-managed-rojo) * [Fully Managed Rojo](https://rojo.space/docs/v7/workflows/#fully-managed-rojo) --- # Sync Details | Rojo [Skip to main content](https://rojo.space/docs/v7/sync-details/#__docusaurus_skipToContent_fallback) Version: v7 On this page Sync Details ============ This page aims to describe how Rojo turns files on the filesystem into Roblox objects. Overview[​](https://rojo.space/docs/v7/sync-details/#overview "Direct link to Overview") ----------------------------------------------------------------------------------------- | Concept | File Name | | --- | --- | | [Folders](https://rojo.space/docs/v7/sync-details/#folders) | any directory | | Server [Scripts](https://rojo.space/docs/v7/sync-details/#scripts) | `*.server.lua` | | Client [Scripts](https://rojo.space/docs/v7/sync-details/#scripts) | `*.client.lua` | | Module [Scripts](https://rojo.space/docs/v7/sync-details/#scripts) | `*.lua` | | XML [Models](https://rojo.space/docs/v7/sync-details/#models) | `*.rbxmx` | | Binary [Models](https://rojo.space/docs/v7/sync-details/#models) | `*.rbxm` | | [Localization Tables](https://rojo.space/docs/v7/sync-details/#localization-tables) | `*.csv` | | [Plain Text](https://rojo.space/docs/v7/sync-details/#plain-text) | `*.txt` | | [JSON Modules](https://rojo.space/docs/v7/sync-details/#json-modules) | `*.json` | | [TOML Modules](https://rojo.space/docs/v7/sync-details/#toml-modules) | `*.toml` | | [JSON Models](https://rojo.space/docs/v7/sync-details/#json-models) | `*.model.json` | | [Projects](https://rojo.space/docs/v7/sync-details/#projects) | `*.project.json` | | [Meta Files](https://rojo.space/docs/v7/sync-details/#meta-files) | `*.meta.json` | Limitations[​](https://rojo.space/docs/v7/sync-details/#limitations "Direct link to Limitations") -------------------------------------------------------------------------------------------------- Not all property types can be synced by Rojo in real-time due to limitations of the Roblox Studio plugin API. In these cases, you can usually generate a place file and open it when you start working on a project. Some common cases you might hit are: * Binary data (Terrain, CSG parts) * `MeshPart.MeshId` * `HttpService.HttpEnabled` For a list of all property types that Rojo can reason about, both when live-syncing and when building place files, look at [rbx-dom's type coverage chart](https://github.com/Roblox/rbx-dom#property-type-coverage) . This limitation may be solved by [issue #205](https://github.com/rojo-rbx/rojo/issues/205) in the future. Folders[​](https://rojo.space/docs/v7/sync-details/#folders "Direct link to Folders") -------------------------------------------------------------------------------------- Any directory on the filesystem will turn into a `Folder` instance with the same name. It is possible for a directory to contain certain files that change what the directory turns into: * An `init.lua`, `init.server.lua`, or `init.client.lua` file, described in [Scripts](https://rojo.space/docs/v7/sync-details/#scripts) . * An `init.meta.json` file that defines `className`, described in [Meta Files](https://rojo.space/docs/v7/sync-details/#meta-files) . * A `default.project.json` file, described in [Projects](https://rojo.space/docs/v7/sync-details/#projects) . Scripts[​](https://rojo.space/docs/v7/sync-details/#scripts "Direct link to Scripts") -------------------------------------------------------------------------------------- Rojo transforms any files with the `lua` extension into the various script instances that Roblox has. * Any file ending in `.server.lua` will turn into a `Script` instance. * Any file ending in `.client.lua` will turn into a `LocalScript` instance. * Any other `.lua` file will turn into a `ModuleScript` instance. Rojo reserves three special script names. These scripts change their parent directory into a script instead of a folder: * `init.server.lua` will change its parent directory into a `Script` instance. * `init.client.lua` will change its parent directory into a `LocalScript` instance. * `init.lua` will change its parent directory into a `ModuleScript` instance. For example, these files: Will turn into these instances in Roblox: Only one "init script" can be present in the same folder. Models[​](https://rojo.space/docs/v7/sync-details/#models "Direct link to Models") ----------------------------------------------------------------------------------- Rojo supports both binary (`.rbxm`) and XML (`.rbxmx`) models generated by Roblox Studio or another tool. For a rundown of supported types, check out [rbx-dom's type coverage chart](https://github.com/rojo-rbx/rbx-dom#property-type-coverage) . Localization Tables[​](https://rojo.space/docs/v7/sync-details/#localization-tables "Direct link to Localization Tables") -------------------------------------------------------------------------------------------------------------------------- Any file with the `csv` extension is transformed into a `LocalizationTable` instance. Rojo expects these files to follow the same format that Roblox does when importing and exporting localization information. An example CSV localization table is: Key,Source,Context,Example,esAck,Ack!,,An exclamation of despair,¡Ay! Plain Text[​](https://rojo.space/docs/v7/sync-details/#plain-text "Direct link to Plain Text") ----------------------------------------------------------------------------------------------- Any file with the `txt` extension is transformed into a `StringValue` instance. This is useful for bringing in text data that can be read by scripts at runtime. JSON Modules[​](https://rojo.space/docs/v7/sync-details/#json-modules "Direct link to JSON Modules") ----------------------------------------------------------------------------------------------------- Any file with the `json` extension that is not a [JSON Model](https://rojo.space/docs/v7/sync-details/#json-models) or a [Project File](https://rojo.space/docs/v7/sync-details/#project-file) will be synced as a `ModuleScript` that returns a table representing the same structure as the JSON file. That is, the following JSON: { "Hello": "world!", "bool": true, "array": [1, 2, 3], "object": { "key 1": 1337, "key 2": [] }} Would become a `ModuleScript` with the following `Source`: return { Hello = "world!", array = {1, 2, 3}, bool = true, object = { ["key 1"] = 1337, ["key 2"] = {}, },} TOML Modules[​](https://rojo.space/docs/v7/sync-details/#toml-modules "Direct link to TOML Modules") ----------------------------------------------------------------------------------------------------- Any file with the `toml` extension will be synced as a `ModuleScript` that returns a table representing the same structure as the TOML file. Due to the easy to read and edit format of TOML, it can be convenient to use them as config files. For a better idea of what synced `toml` files look like, see [JSON Modules](https://rojo.space/docs/v7/sync-details/#json-modules) . There is a single limitation for TOML syncing: `DateTime` values are converted into `string` values and not the corresponding data type. This is due to the conflicting formats used between them. This is not something most people should have to worry about, but it's still something to be aware of. JSON Models[​](https://rojo.space/docs/v7/sync-details/#json-models "Direct link to JSON Models") -------------------------------------------------------------------------------------------------- Files ending in `.model.json` can be used to describe simple models. They're designed to be hand-written and are useful for instances like `RemoteEvent`. A JSON model describing a folder containing a `Part` and a `RemoteEvent` could be written as a file named `My Cool Model.model.json` with: { "ClassName": "Folder", "Children": [ { "Name": "RootPart", "ClassName": "Part", "Properties": { "Size": [4, 4, 4] } }, { "Name": "SendMoney", "ClassName": "RemoteEvent" } ]} It would turn into these instances: Projects[​](https://rojo.space/docs/v7/sync-details/#projects "Direct link to Projects") ----------------------------------------------------------------------------------------- Starting in Rojo 6.0, project files can be included in other project files. This can be useful for reusing pieces between multiple project files. Projects that are intended to be included inside other projects should describe models, not places. If a directory contains a file named `default.project.json`, Rojo will use the contents of the project file instead of anything else in the directory. Meta Files[​](https://rojo.space/docs/v7/sync-details/#meta-files "Direct link to Meta Files") ----------------------------------------------------------------------------------------------- New in Rojo 0.5 are meta files, named `.meta.json`. Meta files allow attaching extra Rojo data to models defined in other formats, like Roblox's `rbxm` and `rbxmx` model formats, or even Lua scripts. This can be used to set Rojo-specific settings like `ignoreUnknownInstances`, or can be used to set properties like `Disabled` on a script. Meta files can contain: * `className`: Changes the `className` of a containing `Folder` into something else. * Usable only in `init.meta.json` files * `properties`: A map of properties to set on the instance, just like projects * Usable on anything except `.rbxmx`, `.rbxm`, and `.model.json` files, which already have properties * `ignoreUnknownInstances`: Works just like `$ignoreUnknownInstances` in project files ### Meta Files to set Rojo metadata[​](https://rojo.space/docs/v7/sync-details/#meta-files-to-set-rojo-metadata "Direct link to Meta Files to set Rojo metadata") Sometimes it's useful to apply properties like `ignoreUnknownInstances` on instances that are defined on the filesystem instead of within the project itself. If your project has `hello.txt` and there are instances underneath it that you want Rojo to ignore when live-syncing, you could create `hello.meta.json` with: { "ignoreUnknownInstances": true} ### Meta Files for Disabled Scripts[​](https://rojo.space/docs/v7/sync-details/#meta-files-for-disabled-scripts "Direct link to Meta Files for Disabled Scripts") Meta files can be used to set properties on `Script` instances, like `Disabled`. If your project has `foo.server.lua` and you want to make sure it would be disabled, you could create a `foo.meta.json` next to it with: { "properties": { "Disabled": true }} ### Meta Files for Tools[​](https://rojo.space/docs/v7/sync-details/#meta-files-for-tools "Direct link to Meta Files for Tools") If you wanted to represent a tool containing a script and a model for its handle, create a directory with an `init.meta.json` file in it: { "className": "Tool", "properties": { "Grip": [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1] }} Instead of a `Folder` instance, you'll end up with a `Tool` instance with the `Grip` property set. * [Overview](https://rojo.space/docs/v7/sync-details/#overview) * [Limitations](https://rojo.space/docs/v7/sync-details/#limitations) * [Folders](https://rojo.space/docs/v7/sync-details/#folders) * [Scripts](https://rojo.space/docs/v7/sync-details/#scripts) * [Models](https://rojo.space/docs/v7/sync-details/#models) * [Localization Tables](https://rojo.space/docs/v7/sync-details/#localization-tables) * [Plain Text](https://rojo.space/docs/v7/sync-details/#plain-text) * [JSON Modules](https://rojo.space/docs/v7/sync-details/#json-modules) * [TOML Modules](https://rojo.space/docs/v7/sync-details/#toml-modules) * [JSON Models](https://rojo.space/docs/v7/sync-details/#json-models) * [Projects](https://rojo.space/docs/v7/sync-details/#projects) * [Meta Files](https://rojo.space/docs/v7/sync-details/#meta-files) * [Meta Files to set Rojo metadata](https://rojo.space/docs/v7/sync-details/#meta-files-to-set-rojo-metadata) * [Meta Files for Disabled Scripts](https://rojo.space/docs/v7/sync-details/#meta-files-for-disabled-scripts) * [Meta Files for Tools](https://rojo.space/docs/v7/sync-details/#meta-files-for-tools) --- # Upgrading From Rojo 6 | Rojo [Skip to main content](https://rojo.space/docs/v7/upgrade/#__docusaurus_skipToContent_fallback) Version: v7 On this page While Rojo 7 is mostly backwards compatible with Rojo 6, it has a couple important breaking changes to be aware of. Explicit Properties in Project/Meta Files[​](https://rojo.space/docs/v7/upgrade/#explicit-properties-in-projectmeta-files "Direct link to Explicit Properties in Project/Meta Files") -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Rojo has support for specifying properties in project files as well as `.meta.json` files. There are two ways to write properties in these files, the explicit syntax and implicit syntax. Rojo's **implicit syntax** has not changed. In Both Rojo 6 and 7, you can write properties like this: { "name": "cool-skateboard", "tree": { "$className": "Part", "$properties": { "Material": "Wood", "Size": [2, 0.5, 6], "Color": [1, 0, 0], "CFrame": [ 0, 10, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 ] } }} info It's strongly recommended to use the implicit syntax when possible! It's shorter, easier to read, and more future-proof. Rojo also has a more **explicit syntax** for specifying property values. This syntax should be used only for a couple reasons: * Using an new enum value that Rojo doesn't know about. * Writing a property with a different value type than what Rojo expects. In Rojo 6, this same model using the **explicit property syntax** would look like this: { "name": "cool-skateboard", "tree": { "$className": "Part", "$properties": { "Material": { "Type": "Enum", "Value": 512 }, "Size": { "Type": "Vector3", "Value": [2, 0.5, 6] }, "Color": { "Type": "Color3", "Value": [1, 0, 0] }, "CFrame": { "Type": "CFrame", "Value": [ 0, 10, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 ] } } }} This format has changed in Rojo 7. The same model with Rojo 7's explicit property syntax would look like this: { "name": "cool-skateboard", "tree": { "$className": "Part", "$properties": { "Material": { "Enum": 512 }, "Size": { "Vector3": [2, 0.5, 6] }, "Color": { "Color3": [1, 0, 0] }, "CFrame": { "CFrame": { "position": [0, 10, 0], "orientation": [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ] } } } }} In Rojo 7, the `Type` and `Value` fields were folded together to reduce the amount of typing. Some types like `CFrame` and `ColorSequence` had fields added or renamed. Since the release of Rojo 6, it has been feasible to use `rbxm` or `rbxmx` files for models instead of typing properties by hand. For more complicated models, this is recommended. * [Explicit Properties in Project/Meta Files](https://rojo.space/docs/v7/upgrade/#explicit-properties-in-projectmeta-files) --- # Properties | Rojo [Skip to main content](https://rojo.space/docs/v7/properties/#__docusaurus_skipToContent_fallback) Version: v7 On this page **This page is a work in progress. It may not be complete or accurate yet.** Rojo supports most Roblox properties. This page documents all of the properties that Rojo supports, as well as their syntax when written in project files. Property Type Support[​](https://rojo.space/docs/v7/properties/#property-type-support "Direct link to Property Type Support") ------------------------------------------------------------------------------------------------------------------------------ | Property Type | Example Property | Build | Live Sync | Project Files | | --- | --- | --- | --- | --- | | [Attributes](https://rojo.space/docs/v7/properties/#attributes) | `Instance.Attributes` | ✔ | ✔ | ✔ | | [Axes](https://rojo.space/docs/v7/properties/#axes) | `ArcHandles.Axes` | ✔ | ✔ | ✔ | | [BinaryString](https://rojo.space/docs/v7/properties/#binarystring) | `BinaryStringValue.Value` | ✔ | ❌ | ✔ | | [Bool](https://rojo.space/docs/v7/properties/#bool) | `Part.Anchored` | ✔ | ✔ | ✔ | | [BrickColor](https://rojo.space/docs/v7/properties/#brickcolor) | `Part.BrickColor` | ✔ | ✔ | ✔ | | [CFrame](https://rojo.space/docs/v7/properties/#cframe) | `Camera.CFrame` | ✔ | ✔ | ✔ | | [Color3](https://rojo.space/docs/v7/properties/#color3) | `Lighting.Ambient` | ✔ | ✔ | ✔ | | [Color3uint8](https://rojo.space/docs/v7/properties/#color3uint8) | `Part.BrickColor` | ✔ | ✔ | ✔ | | [ColorSequence](https://rojo.space/docs/v7/properties/#colorsequence) | `Beam.Color` | ✔ | ✔ | ✔ | | [Content](https://rojo.space/docs/v7/properties/#content) | `Decal.Texture` | ✔ | ✔ | ✔ | | [Enum](https://rojo.space/docs/v7/properties/#enum) | `Part.Shape` | ✔ | ✔ | ✔ | | [Faces](https://rojo.space/docs/v7/properties/#faces) | `Handles.Faces` | ✔ | ✔ | ✔ | | [Float32](https://rojo.space/docs/v7/properties/#float32) | `Players.RespawnTime` | ✔ | ✔ | ✔ | | [Float64](https://rojo.space/docs/v7/properties/#float64) | `Sound.PlaybackLoudness` | ✔ | ✔ | ✔ | | [Font](https://rojo.space/docs/v7/properties/#font) | `TextLabel.FontFace` | ✔ | ✔ | ✔ | | [Int32](https://rojo.space/docs/v7/properties/#int32) | `Frame.ZIndex` | ✔ | ✔ | ✔ | | [Int64](https://rojo.space/docs/v7/properties/#int64) | `Player.UserId` | ✔ | ✔ | ✔ | | [MaterialColors](https://rojo.space/docs/v7/properties/#materialcolors) | `Terrain.MaterialColors` | ✔ | ✔ | ✔ | | [NumberRange](https://rojo.space/docs/v7/properties/#numberrange) | `ParticleEmitter.Lifetime` | ✔ | ✔ | ✔ | | [NumberSequence](https://rojo.space/docs/v7/properties/#numbersequence) | `Beam.Transparency` | ✔ | ✔ | ✔ | | [OptionalCoordinateFrame](https://rojo.space/docs/v7/properties/#optionalcoordinateframe) | `Model.WorldPivotData` | ✔ | ❌ | ✔ | | [PhysicalProperties](https://rojo.space/docs/v7/properties/#physicalproperties) | `Part.CustomPhysicalProperties` | ✔ | ✔ | ✔ | | [ProtectedString](https://rojo.space/docs/v7/properties/#protectedstring) | `ModuleScript.Source` | ✔ | ✔ | ✔ | | [Ray](https://rojo.space/docs/v7/properties/#ray) | `RayValue.Value` | ✔ | ✔ | ✔ | | [Rect](https://rojo.space/docs/v7/properties/#rect) | `ImageButton.SliceCenter` | ✔ | ✔ | ✔ | | [Ref](https://rojo.space/docs/v7/properties/#ref) | `Model.PrimaryPart` | ✔ | ✔ | ❌ | | [Region3](https://rojo.space/docs/v7/properties/#region3) | N/A | ✔ | ✔ | ❌ | | [Region3int16](https://rojo.space/docs/v7/properties/#region3int16) | `Terrain.MaxExtents` | ✔ | ✔ | ❌ | | [SharedString](https://rojo.space/docs/v7/properties/#sharedstring) | N/A | ✔ | ✔ | ❌ | | [String](https://rojo.space/docs/v7/properties/#string) | `Instance.Name` | ✔ | ✔ | ✔ | | [Tags](https://rojo.space/docs/v7/properties/#tags) | `Instance.Tags` | ✔ | ✔ | ✔ | | [UDim](https://rojo.space/docs/v7/properties/#udim) | `UIListLayout.Padding` | ✔ | ✔ | ✔ | | [UDim2](https://rojo.space/docs/v7/properties/#udim2) | `Frame.Size` | ✔ | ✔ | ✔ | | [Vector2](https://rojo.space/docs/v7/properties/#vector2) | `ImageLabel.ImageRectSize` | ✔ | ✔ | ✔ | | [Vector2int16](https://rojo.space/docs/v7/properties/#vector2int16) | N/A | ✔ | ✔ | ✔ | | [Vector3](https://rojo.space/docs/v7/properties/#vector3) | `Part.Size` | ✔ | ✔ | ✔ | | [Vector3int16](https://rojo.space/docs/v7/properties/#vector3int16) | `TerrainRegion.ExtentsMax` | ✔ | ✔ | ✔ | | QDir | `Studio.Auto-Save Path` | ❌ | ❌ | ❌ | | QFont | `Studio.Font` | ❌ | ❌ | ❌ | Properties in Project Files[​](https://rojo.space/docs/v7/properties/#properties-in-project-files "Direct link to Properties in Project Files") ------------------------------------------------------------------------------------------------------------------------------------------------ Many types have an **implicit** and **explicit** format. The [Project format page](https://rojo.space/docs/v7/project-format/#instance-property-value) decribes these formats in more detail. ### Attributes[​](https://rojo.space/docs/v7/properties/#attributes "Direct link to Attributes") Rojo defines the "Attributes" property on any instance to have the Attributes type, allowing it to be specified implicitly. For both implicit and explicit values, the format is an object where each field represents an attribute, where the key is the name of the attribute, and the value must be an explicit value. { "$properties": { "Attributes": { "Foo": {"Bool": true}, "Bar": {"Vector3": [1.0, 2.0, 3.0]}, }, "AttributesSerialized": { "Attributes": { "Foo": {"Bool": true}, "Bar": {"Vector3": [1.0, 2.0, 3.0]}, } } }} The following types are supported for attribute values: * [Bool](https://rojo.space/docs/v7/properties/#bool) * [BrickColor](https://rojo.space/docs/v7/properties/#brickcolor) * [CFrame](https://rojo.space/docs/v7/properties/#cframe) * [Color3](https://rojo.space/docs/v7/properties/#color3) * [ColorSequence](https://rojo.space/docs/v7/properties/#colorsequence) * [Float64](https://rojo.space/docs/v7/properties/#float64) * [Font](https://rojo.space/docs/v7/properties/#font) * [NumberRange](https://rojo.space/docs/v7/properties/#numberrange) * [NumberSequence](https://rojo.space/docs/v7/properties/#numbersequence) * [Rect](https://rojo.space/docs/v7/properties/#rect) * [String](https://rojo.space/docs/v7/properties/#string) * [UDim](https://rojo.space/docs/v7/properties/#udim) * [UDim2](https://rojo.space/docs/v7/properties/#udim2) * [Vector2](https://rojo.space/docs/v7/properties/#vector2) * [Vector3](https://rojo.space/docs/v7/properties/#vector3) ### Axes[​](https://rojo.space/docs/v7/properties/#axes "Direct link to Axes") The Axes type cannot be specified implicitly. For explicit values, the format is a list of strings, each of which may be either "X", "Y", or "Z". Each string sets the corresponding component. { "$properties": { "ExplicitExample1": {"Axes": ["X", "Y", "Z"]}, "ExplicitExample2": {"Axes": ["X", "Z"]}, "ExplicitExample3": {"Axes": []} }} ### BinaryString[​](https://rojo.space/docs/v7/properties/#binarystring "Direct link to BinaryString") The BinaryString type cannot be specified implicitly. For explicit values, the format is a base64-encoded string. { "$properties": { "ExplicitExample": {"BinaryString": "SGVsbG8sIHdvcmxkIQ=="} }} ### Bool[​](https://rojo.space/docs/v7/properties/#bool "Direct link to Bool") For both implicit and explicit values, the format is a boolean value. { "$properties": { "ImplicitExample": true, "ExplicitExample": {"Bool": false} }} ### BrickColor[​](https://rojo.space/docs/v7/properties/#brickcolor "Direct link to BrickColor") The BrickColor type cannot be specified implicitly. For explicit values, the format is an integer representing the [Number](https://developer.roblox.com/en-us/articles/BrickColor-Codes) of a BrickColor. { "$properties": { "ExplicitExample": {"BrickColor": 194} }} ### CFrame[​](https://rojo.space/docs/v7/properties/#cframe "Direct link to CFrame") For implicit values, the format is a flat list of components. { "$properties": { "ImplicitExample": [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] }} For explicit values, the format is an object with position and orientation fields. { "$properties": { "ExplicitExample": { "CFrame": { "position": [1.0, 2.0, 3.0], "orientation": [ [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0] ] } } }} ### Color3[​](https://rojo.space/docs/v7/properties/#color3 "Direct link to Color3") For both implicit and explicit values, the format is a list of R, G and B components, respectively. Each component is a float in the range \[0, 1\]. { "$properties": { "ImplicitExample": [ 0.6392156862745098, 0.6352941176470588, 0.6470588235294118 ], "ExplicitExample": { "Color3": [ 0.6392156862745098, 0.6352941176470588, 0.6470588235294118 ] } }} ### Color3uint8[​](https://rojo.space/docs/v7/properties/#color3uint8 "Direct link to Color3uint8") The Color3uint8 type cannot be specified implicitly. For explicit values, the format is a list of R, G and B components, respectively. Each component is an integer in the range \[0, 255\]. { "$properties": { "ExplicitExample": { "Color3uint8": [163, 162, 165] } }} ### ColorSequence[​](https://rojo.space/docs/v7/properties/#colorsequence "Direct link to ColorSequence") The ColorSequence type cannot be specified implicitly. For explicit values, the format is an object with a keypoints field, which is an array of ColorSequenceKeypoints. Each ColorSequenceKeypoint is an object with time and color fields. The color field is a [Color3](https://rojo.space/docs/v7/properties/#color3) . { "$properties": { "ExplicitExample": { "ColorSequence": { "keypoints": [ { "time": 0.0, "color": [1.0, 1.0, 0.5] }, { "time": 1.0, "color": [0.0, 0.0, 0.0] } ] } } }} ### Content[​](https://rojo.space/docs/v7/properties/#content "Direct link to Content") For both implicit and explicit values, the format is a string. { "$properties": { "ImplicitExample": "rbxassetid://12345", "ExplicitExample": {"Content": "rbxassetid://12345"} }} ### Enum[​](https://rojo.space/docs/v7/properties/#enum "Direct link to Enum") For implicit values, the format is a string corresponding to the name of the enum item. For example: { "$className": "SurfaceLight", "$properties": { "Face": "Front" }} For explicit values, the format is an integer corresponding to the value of the enum item. For example: { "$className": "SurfaceLight", "$properties": { "Face": { "Enum": 5 } }} ### Faces[​](https://rojo.space/docs/v7/properties/#faces "Direct link to Faces") The Faces type cannot be specified implicitly. For explicit values, the format is a list of strings, each of which may be either "Right", "Top", "Back", "Left", "Bottom", or "Front". Each string sets the corresponding component. { "$properties": { "ExplicitExample1": {"Faces": ["Right", "Top", "Back", "Left", "Bottom", "Front"]}, "ExplicitExample2": {"Faces": ["Right", "Top", "Front"]}, "ExplicitExample3": {"Faces": []} }} ### Float32[​](https://rojo.space/docs/v7/properties/#float32 "Direct link to Float32") For both implicit and explicit values, the format is a number. { "$properties": { "ImplicitExample": 15.0, "ExplicitExample": {"Float32": 15.0} }} ### Float64[​](https://rojo.space/docs/v7/properties/#float64 "Direct link to Float64") For both implicit and explicit values, the format is a number. { "$properties": { "ImplicitExample": 15123.0, "ExplicitExample": {"Float64": 15123.0} }} ### Font[​](https://rojo.space/docs/v7/properties/#font "Direct link to Font") For both implicit and explicit values, the format is an object with family, weight, and style fields. Each component is a string. { "$properties": { "ImplicitExample": { "family": "rbxasset://fonts/families/LegacyArial.json", "weight": "Regular", "style": "Normal" }, "ExplicitExample": { "Font": { "family": "rbxasset://fonts/families/LegacyArial.json", "weight": "Regular", "style": "Normal" } } }} ### Int32[​](https://rojo.space/docs/v7/properties/#int32 "Direct link to Int32") For both implicit and explicit values, the format is an integer. { "$properties": { "ImplicitExample": 6014, "ExplicitExample": {"Int32": 6014} }} ### Int64[​](https://rojo.space/docs/v7/properties/#int64 "Direct link to Int64") For both implicit and explicit values, the format is an integer. { "$properties": { "ImplicitExample": 23491023, "ExplicitExample": {"Int64": 23491023} }} ### MaterialColors[​](https://rojo.space/docs/v7/properties/#materialcolors "Direct link to MaterialColors") For both implicit and explicit values, the type is an object that looks like this: { "$properties": { "ImplicitExample": { "Grass": [10, 20, 30], "Asphalt": [40, 50, 60], "LeafyGrass": [255, 155, 55] }, "ExplicitExample": { "MaterialColors": { "Grass": [10, 20, 30], "Asphalt": [40, 50, 60], "LeafyGrass": [255, 155, 55] } } }} The key-value pairs within the object should be [Material](https://create.roblox.com/docs/reference/engine/enums/Material) enum items mapped to arrays of 3 integers representing the RGB of the specified color. Only the values you wish to change the defaults of need to be specified. ### NumberRange[​](https://rojo.space/docs/v7/properties/#numberrange "Direct link to NumberRange") The NumberRange type cannot be specified implicitly. For explicit values, the format is a list of Min and Max components, respectively. Each component is a float. { "$properties": { "ExplicitExample": {"NumberRange": [-36.0, 94.0]} }} ### NumberSequence[​](https://rojo.space/docs/v7/properties/#numbersequence "Direct link to NumberSequence") The NumberSequence type cannot be specified implicitly. For explicit values, the format is an object with a keypoints field, which is an array of NumberSequenceKeypoints. Each ColorSequenceKeypoint is an object with time, value, and envelope fields. { "$properties": { "ExplicitExample": { "NumberSequence": { "keypoints": [ { "time": 0.0, "value": 5.0, "envelope": 2.0 }, { "time": 1.0, "value": 22.0, "envelope": 0.0 } ] } } }} ### OptionalCoordinateFrame[​](https://rojo.space/docs/v7/properties/#optionalcoordinateframe "Direct link to OptionalCoordinateFrame") TODO ### PhysicalProperties[​](https://rojo.space/docs/v7/properties/#physicalproperties "Direct link to PhysicalProperties") The PhysicalProperties type cannot be specified implicitly. For explicit values, there are two formats. The constant string "Default", which represents the default PhysicalProperties value. { "$properties": { "ExplicitExample": {"PhysicalProperties": "Default"} }} An object with fields corresponding to each component. { "$properties": { "ExplicitExample": { "PhysicalProperties": { "density": 0.5, "friction": 1.0, "elasticity": 0.0, "frictionWeight": 50.0, "elasticityWeight": 25.0 } } }} ### ProtectedString[​](https://rojo.space/docs/v7/properties/#protectedstring "Direct link to ProtectedString") For both implicit and explicit values, the format is a string. { "$properties": { "ImplicitExample": "print('Hello world!')", "ExplicitExample": {"ProtectedString": "print('Hello world!')"} }} ### Ray[​](https://rojo.space/docs/v7/properties/#ray "Direct link to Ray") The Ray type cannot be specified implicitly. For explicit values, there are several possible formats. An object with origin and direction fields. Each component is a [Vector3](https://rojo.space/docs/v7/properties/#vector3) . { "$properties": { "ExplicitExample": { "Ray": { "origin": [1.0, 2.0, 3.0], "direction": [4.0, 5.0, 6.0] } } }} A list of Origin and Direction components, respectively. Each component is a [Vector3](https://rojo.space/docs/v7/properties/#vector3) . { "$properties": { "ExplicitExample": { "Ray": [ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0] ] } }} ### Rect[​](https://rojo.space/docs/v7/properties/#rect "Direct link to Rect") The Rect type cannot be specified implicitly. For explicit values, the format is a list of Min and Max components, respectively. Each component is a [Vector2](https://rojo.space/docs/v7/properties/#vector2) . { "$properties": { "ExplicitExample": { "Rect": [ [0.0, 5.0], [10.0, 15.0] ] } }} ### Ref[​](https://rojo.space/docs/v7/properties/#ref "Direct link to Ref") Not implemented. ### Region3[​](https://rojo.space/docs/v7/properties/#region3 "Direct link to Region3") Not implemented. ### Region3int16[​](https://rojo.space/docs/v7/properties/#region3int16 "Direct link to Region3int16") Not implemented. ### SharedString[​](https://rojo.space/docs/v7/properties/#sharedstring "Direct link to SharedString") Not implemented. ### String[​](https://rojo.space/docs/v7/properties/#string "Direct link to String") For both implicit and explicit values, the format is a string. { "$properties": { "ImplicitExample": "Hello, world!", "ExplicitExample": {"String": "Hello, world!"} }} ### Tags[​](https://rojo.space/docs/v7/properties/#tags "Direct link to Tags") For both implicit and explicit values, the format is a list of strings, where each string is a tag. { "$properties": { "ImplicitExample": ["foo", "con'fusion?!", "bar"], "ExplicitExample": {"Tags": ["foo", "con'fusion?!", "bar"]} }} ### UDim[​](https://rojo.space/docs/v7/properties/#udim "Direct link to UDim") The UDim type cannot be specified implicitly. For explicit values, the format is a list of Scale and Offset components, respectively. Scale is a float, and Offset is an integer. { "$properties": { "ExplicitExample": {"UDim": [1.0, 32]} }} ### UDim2[​](https://rojo.space/docs/v7/properties/#udim2 "Direct link to UDim2") The UDim2 type cannot be specified implicitly. For explicit values, the format is a list of X and Y components, respectively. Each component is a [UDim](https://rojo.space/docs/v7/properties/#udim) . { "$properties": { "ExplicitExample": {"UDim2": [[-1.0, 100], [1.0, -100]]} }} ### Vector2[​](https://rojo.space/docs/v7/properties/#vector2 "Direct link to Vector2") For both implicit and explicit values, the format is a list of X and Y components, respectively. Each component is a float. { "$properties": { "ImplicitExample": [-50.0, 50.0], "ExplicitExample": {"Vector2": [-50.0, 50.0]} }} ### Vector2int16[​](https://rojo.space/docs/v7/properties/#vector2int16 "Direct link to Vector2int16") For both implicit and explicit values, the format is a list of X and Y components, respectively. Each component is an integer. { "$properties": { "ImplicitExample": [-300, 300], "ExplicitExample": {"Vector2int16": [-300, 300]} }} ### Vector3[​](https://rojo.space/docs/v7/properties/#vector3 "Direct link to Vector3") For both implicit and explicit values, the format is a list of X, Y, and Z components, respectively. Each component is an float. { "$properties": { "ImplicitExample": [-300.0, 0.0, 1500.0], "ExplicitExample": {"Vector3": [-300.0, 0.0, 1500.0]} }} ### Vector3int16[​](https://rojo.space/docs/v7/properties/#vector3int16 "Direct link to Vector3int16") For both implicit and explicit values, the format is a list of X, Y, and Z components, respectively. Each component is an integer. { "$properties": { "ImplicitExample": [60, 37, -450], "ExplicitExample": {"Vector3int16": [60, 37, -450]} }} * [Property Type Support](https://rojo.space/docs/v7/properties/#property-type-support) * [Properties in Project Files](https://rojo.space/docs/v7/properties/#properties-in-project-files) * [Attributes](https://rojo.space/docs/v7/properties/#attributes) * [Axes](https://rojo.space/docs/v7/properties/#axes) * [BinaryString](https://rojo.space/docs/v7/properties/#binarystring) * [Bool](https://rojo.space/docs/v7/properties/#bool) * [BrickColor](https://rojo.space/docs/v7/properties/#brickcolor) * [CFrame](https://rojo.space/docs/v7/properties/#cframe) * [Color3](https://rojo.space/docs/v7/properties/#color3) * [Color3uint8](https://rojo.space/docs/v7/properties/#color3uint8) * [ColorSequence](https://rojo.space/docs/v7/properties/#colorsequence) * [Content](https://rojo.space/docs/v7/properties/#content) * [Enum](https://rojo.space/docs/v7/properties/#enum) * [Faces](https://rojo.space/docs/v7/properties/#faces) * [Float32](https://rojo.space/docs/v7/properties/#float32) * [Float64](https://rojo.space/docs/v7/properties/#float64) * [Font](https://rojo.space/docs/v7/properties/#font) * [Int32](https://rojo.space/docs/v7/properties/#int32) * [Int64](https://rojo.space/docs/v7/properties/#int64) * [MaterialColors](https://rojo.space/docs/v7/properties/#materialcolors) * [NumberRange](https://rojo.space/docs/v7/properties/#numberrange) * [NumberSequence](https://rojo.space/docs/v7/properties/#numbersequence) * [OptionalCoordinateFrame](https://rojo.space/docs/v7/properties/#optionalcoordinateframe) * [PhysicalProperties](https://rojo.space/docs/v7/properties/#physicalproperties) * [ProtectedString](https://rojo.space/docs/v7/properties/#protectedstring) * [Ray](https://rojo.space/docs/v7/properties/#ray) * [Rect](https://rojo.space/docs/v7/properties/#rect) * [Ref](https://rojo.space/docs/v7/properties/#ref) * [Region3](https://rojo.space/docs/v7/properties/#region3) * [Region3int16](https://rojo.space/docs/v7/properties/#region3int16) * [SharedString](https://rojo.space/docs/v7/properties/#sharedstring) * [String](https://rojo.space/docs/v7/properties/#string) * [Tags](https://rojo.space/docs/v7/properties/#tags) * [UDim](https://rojo.space/docs/v7/properties/#udim) * [UDim2](https://rojo.space/docs/v7/properties/#udim2) * [Vector2](https://rojo.space/docs/v7/properties/#vector2) * [Vector2int16](https://rojo.space/docs/v7/properties/#vector2int16) * [Vector3](https://rojo.space/docs/v7/properties/#vector3) * [Vector3int16](https://rojo.space/docs/v7/properties/#vector3int16) ---