Rojito turns juggling multiple Rojo projects into changing workspaces instead of babysitting servers and ports. Pick a game, and Rojito stops whatever was serving, starts the one you want on a fixed port, and opens its place in Studio. Only one game is ever live at a time.
If you build more than one Roblox game, you know the dance: cd into a project, rojo serve, remember which port, kill it, cd into the next one, reconnect the plugin, repeat. Switch to the wrong terminal and you sync the wrong game into the wrong place.
Rojito makes that a single click. It scans a folder full of Rojo projects, lists them all, and lets you flip between them like tabs — each on the same consistent port (34872) so your Studio plugin never loses track.
- 🔎 Auto-discovery — point it at a root folder (default
~/Developer/Roblox) and it finds every*.project.json, listed and searchable. Repos that nest the Rojo project in a subfolder (PlayerLab/playerlab-roblox/) are found too, and still listed under the repo's name. - ⚡ One-click switch — click a game to serve it and open its place in Studio. The previous server stops automatically. Radio-style: one game live at a time, always the same port.
- 🏠 Per-project places — each game gets its own PlaceId, so state never leaks between games. (See The state-bleed trap below — this is the whole reason Rojito exists.)
- 🛡️ Cross-sync guard — if a project declares
servePlaceIdsand the PlaceId you saved isn't one of them, Rojito warns you before connecting, because Rojo would refuse to sync anyway. - 🟢 Live status — the menu-bar glyph and a status pill show Idle / Starting / Serving / Error, plus a dot for whether Roblox Studio is running.
- 🛠️ Right-there actions — hover any row to open the folder in your IDE (Cursor by default), reveal it in Finder, open its place in Studio, or Focus IDE + Studio to bring both to the front.
- 📜 Built-in logs, Restart & Stop — watch Rojo's output, restart the server, or stop everything, right from the footer.
- 🪶 Genuinely lightweight — a native SwiftUI menu-bar app. No dock icon, no Electron, ~1 MB.
The obvious approach is one clean test place that every game syncs into. It doesn't work — and Rojito was built the moment we hit the wall.
Rojo only writes the instances and properties in the current project's tree, and it never removes what a previous game left behind. So this, in one game:
...leaves your next game locked in first person, because that game doesn't manage StarterPlayer and Rojo has nothing to reset it back to. Camera modes, lighting, service properties, stray instances — they all pile up in a shared place.
Rojito's answer: give each game its own place. Assign a PlaceId per project (Rojito remembers it), and clicking a game opens that game's place. No shared state, no bleed, and it matches your real publish targets.
Requires macOS 14+, the Xcode command-line tools, and Rojo installed via Aftman/Rokit or on your PATH. Rojito resolves the newest concrete rojo binary itself, so it works even outside a project that lists Rojo in aftman.toml.
git clone <your-repo-url> Rojito && cd Rojito
./build.sh # compiles + assembles Rojito.app (ad-hoc signed)
cp -R Rojito.app /Applications/
open /Applications/Rojito.app # look for the ◎ icon in your menu barRun at login: add Rojito.app under System Settings → General → Login Items.
- Click the menu-bar icon. Every Rojo project under your root folder is listed — start typing to filter.
- First time per game: hover a row →
⋯→ Set PlaceId…, and paste that game's PlaceId (the number in its Roblox place URL). Rows showno PlaceIdin orange until you do. - Click a game. Rojito serves it on port 34872 and opens its place in Studio. Connect the Rojo plugin in that place and go.
- Switch games by clicking another — the old server dies, the new one starts, the right place opens. Click the live game again (or Stop) to serve nothing.
Prefer to just swap what's served without Studio popping up? Toggle the little window icon in the footer to turn auto-open off.
Everything persists in UserDefaults:
| Setting | Default | Where |
|---|---|---|
| Root folder | ~/Developer/Roblox |
Footer folder button |
| Port | 34872 (Rojo's default) |
— |
| IDE | Cursor (com.todesktop.230313mzl4w4u92) |
— |
| PlaceId (per project) | from servePlaceIds if present |
Row ⋯ → Set PlaceId |
| Auto-open Studio on switch | On | Footer window icon |
A small, readable SwiftUI codebase:
Sources/Rojito/
RojitoApp.swift MenuBarExtra entry (.window style)
AppState.swift scanning · the single serve process · actions · persistence
ProjectScanner.swift finds *.project.json under the root (up to 3 levels deep)
RojoLocator.swift resolves the newest concrete rojo binary
MenuContentView.swift header · search · list · footer · logs
ProjectRow.swift one project row + PlaceId editor
Resources/ Info.plist (LSUIElement) · icon generator
build.sh assembles the .app bundle
- Companion Studio plugin that reports the currently-open PlaceId, so Rojito can auto-highlight and activate the matching project — a hands-free publish loop.
- MCP-connection status indicator.
- Optional world-generation / preview actions.
MIT — do whatever you like. Not affiliated with or endorsed by Roblox Corporation.