Vertigo Sync reads the same default.project.json format that Rojo established. Your existing project file works without modification. The migration is fully reversible -- you can switch back to Rojo at any time without changing your source files.
| Task | Rojo | Vertigo Sync |
|---|---|---|
| Start sync server | rojo serve default.project.json |
vsync serve |
| Build place file | rojo build default.project.json -o place.rbxl |
vsync build -o place.rbxl |
| Default port | 34872 |
7575 |
| Plugin install | Manual .rbxm install |
vsync plugin-install |
cargo install --path .If Rojo is running, stop it. You can run both simultaneously on different ports, but only one Studio plugin should be active at a time.
From the same project root where you ran rojo serve:
vsync serveThat is it. Vertigo Sync reads the same default.project.json and maps the same source paths.
vsync plugin-installIf you had the Rojo plugin installed, disable it in Studio to avoid conflicts.
The Vertigo Sync plugin connects automatically. You should see a green "Connected" status within seconds.
Run vsync migrate in a project directory that has Rojo ecosystem config files:
vsync migrateThis reads the following files (if present) and merges them into a single vsync.toml:
| Source file | Migrated to |
|---|---|
wally.toml |
[package], [dependencies], [server-dependencies], [dev-dependencies] |
selene.toml |
[lint] (carries over the std hint and default rule severities) |
stylua.toml |
[format] (indent type, width, line width, quote style, call parentheses) |
If aftman.toml or foreman.toml is detected, vsync reports their presence. Those files can be removed since vsync bundles all the tools they managed.
vsync migrate does not overwrite an existing vsync.toml. It is safe to run repeatedly.
| Before | After |
|---|---|
rojo serve |
vsync serve |
rojo build -o game.rbxl |
vsync build -o game.rbxl |
rojo sourcemap |
vsync sourcemap |
selene src/ |
vsync validate |
stylua src/ |
vsync fmt |
stylua --check src/ |
vsync fmt --check |
wally install |
vsync install |
A typical CI pipeline migration:
# Before
- run: aftman install
- run: wally install
- run: selene src/
- run: stylua --check src/
- run: rojo build -o game.rbxl
# After
- run: cargo install vertigo-sync
- run: vsync install
- run: vsync validate
- run: vsync fmt --check
- run: vsync build -o game.rbxldefault.project.jsonformat -- same schema, same$path/$classNamedirectives, same$ignoreUnknownInstances- Source file conventions --
init.server.luau,init.client.luau,init.luau,.server.luau,.client.luau - Path mapping --
src/Server/to ServerScriptService,src/Client/to StarterPlayerScripts, etc. - Extended file types --
.json(ModuleScript),.txt(StringValue),.csv(LocalizationTable) .meta.jsonfiles -- instance properties and attributes
| Feature | Rojo | Vertigo Sync |
|---|---|---|
| Primary transport | HTTP polling | WebSocket (real-time) |
| Fallback | None | SSE, then HTTP polling |
| Reconnection | Manual | Automatic with exponential backoff |
| Lag recovery | Manual resync | Automatic (server sends lagged message) |
Rojo intentionally defers linting to dedicated tools like Selene, which is a reasonable design choice for a sync-focused tool. Vertigo Sync takes a different approach and bundles a built-in linter for convenience:
vsync validateRules cover strict mode, NCG optimization, deprecated APIs, hot-path allocations, and cross-boundary requires.
| Feature | Rojo | Vertigo Sync |
|---|---|---|
| Prometheus metrics | No | /metrics endpoint |
| Workspace attributes | No | 15+ telemetry attributes |
| Apply throughput tracking | No | Adaptive frame budget with EWMA |
| Connection state machine | No | 5-state visual indicator |
| Feature | Rojo | Vertigo Sync |
|---|---|---|
| Welcome screen | No | Yes (first-time setup guide) |
| Toast notifications | No | Yes (sync events, errors) |
| Time-travel | No | Yes (scrubber + history list) |
| Feature toggles | No | Yes (binary models, builders; builders stay off until enabled) |
| Instance pooling | No | Yes (128 per class, zero GC in hot path) |
| Adaptive frame budget | No | Yes (scales with Studio frame time) |
| Project identity binding | No | Yes (plugin remembers last good project and fails closed on ambiguous discovery) |
Navigate through your sync history with step/jump controls and a scrubber UI. Rewind to any previous snapshot to inspect the source tree at that point in time.
Agent-native tools for reading, writing, validating, and observing your source tree. Designed for AI-assisted development workflows.
Same source tree always produces the same fingerprint hash. This enables CI-grade reproducibility and drift detection.
You can run Rojo and Vertigo Sync side by side during evaluation:
# Terminal 1: Rojo on default port
rojo serve default.project.json
# Terminal 2: Vertigo Sync on its default port
vsync serveThey use different ports (34872 vs 7575) and different Studio plugins, so there is no conflict. Enable only one plugin at a time in Studio.
If you need to go back to Rojo:
- Stop Vertigo Sync
- Disable the Vertigo Sync plugin in Studio
- Re-enable the Rojo plugin
- Start
rojo serve
No source files are modified. The migration is fully reversible.
Once migration is confirmed working, remove the files that vsync replaces:
rm -f wally.toml wally.lock selene.toml stylua.toml aftman.toml foreman.tomlKeep default.project.json -- vsync uses it directly.
vsync's built-in linter covers a different set of rules than selene. If a project uses selene rules that vsync does not implement, both tools can be used together. vsync runs selene automatically during vsync validate when selene is found on PATH.