Why RoFlux

There are a few good ways to work on a Roblox game from real files. This page helps you pick one. The short answer: choose RoFlux when you want your build to do more than copy files, like running your own code or turning other languages and formats into instances.

The short version

ToolIn shortA good fit when
RojoThe long standing standard. Your files are the source of truth and map onto instances in Studio.You want the most proven tool, with the biggest community and the most tools built around it.
Azul and CarbonStudio first, two way sync. What you do in Studio is saved to your files and back.You build mostly in Studio and want your scripts on disk for your editor.
Pesto and VerdeEditor tools that improve local work, or show a copy of the Explorer and Properties windows inside VS Code.You want to browse and edit the game tree without leaving your editor.
RoFluxFiles are the source of truth and sync one way into Studio, with a script system that runs during every build.You want to shape, generate or transpile what reaches Studio.

These tools do not have to compete. The right one depends on where you like to work and how much control you want over the build.

Your build runs your code

Most sync tools follow a fixed set of rules: this file becomes that instance. RoFlux has those rules too, but it also runs Luau scripts from your project's scripts/ folder during every build. They work like plugins for the sync itself.

A script can:

Each of those is a few lines. Here is a version line added to every script in the game:

-- scripts/version.luau
roflux.onTransfer(function(file)
	return `-- {roflux.project().name} built {os.date("%Y-%m-%d")}\n` .. file.source
end)

Your scripts get a full toolkit: reading and writing project files, JSON and TOML, building instances, value helpers, a cache, and require for splitting them up. Your editor type checks all of it. See the Script system and the Script API.

Any file, any language

A script can claim a file extension and say what those files become. That makes RoFlux a place to plug in other languages and formats, with no extra build step and no second tool watching your files.

This turns every .csv file into a ModuleScript that returns its rows:

-- scripts/csv.luau
roflux.transpile("csv", function(file)
	local rows = {}

	for _, line in roflux.text.lines(file.text) do
		table.insert(rows, roflux.text.split(line, ","))
	end

	return roflux.luau.module(rows)
end)

Returning text makes a ModuleScript with that source. Return a declaration instead and one file can build any number of instances. Either way:

Your Luau is never touched unless you ask. RoFlux sends it to Studio exactly as written, and only a script you wrote can change it.

Other things you get

When to pick something else

RoFlux is not the right tool for everyone. Pick something else when:

Coming from Rojo

The ideas are close, so moving over is mostly renaming.

In RojoIn RoFlux
a tree of folders in default.project.jsonfolders with an init.meta.json that says "$Parent"
"$className""$ClassName"
"$path""$Path"
"$properties"write properties straight in, or use "$Properties"
Thing.model.jsonThing.inst.json
init.meta.jsoninit.meta.json, which can also move the folder with "$Parent"
rojo sourcemapwritten for you on every build
rojo plugin installroflux plugin

One thing to know: loose files at the top of a RoFlux project are ignored. Only meta.inst.json and folders with an init.meta.json are compiled there. See the project root rules.