Yeet — Bidirectional sync between Roblox Studio and VS Code / Antigravity

Hey everyone! :waving_hand:

I hope you like it!
This is my first post on DevForum and I have a big surprise for you!!

I’d like to share a tool I’ve been building: Yeet, a bidirectional code sync system between Roblox Studio and external editors like VS Code and Antigravity.

:warning: Upfront disclaimer

Yeet was built using vibe coding (AI-assisted, fast prototyping, heavy iteration). What that means:

  • It works and I’m using it in real projects, but it likely has bugs and edge cases I haven’t hit yet.
  • Anything you report will be fixed as fast as I can — open an issue on GitHub or reply to this thread.
  • Current version is v0.3.1, still early-stage. Expect frequent changes.

I’d rather be honest about that from the start than oversell it.

What is Yeet?

Yeet lets you edit your scripts in VS Code (or Antigravity) and have changes reflected in Studio in real time — and the other way around. Genuinely bidirectional sync.

The on-disk folder layout is compatible with Rojo, so if you already use Rojo, you’ll feel at home. But Yeet is not a Rojo wrapper — it’s a separate implementation with slightly different goals:

  • Full-tree sync in both directions (not just disk → Studio).
  • 3-pane hunk merge inside Studio when there’s a conflict.
  • Reverse bootstrap: take an existing Studio project and generate the on-disk structure straight from the plugin UI.

How it works under the hood

Yeet has three components that talk to each other:

  1. Rust daemon — runs locally and acts as the sync brain. It watches the filesystem, keeps state, and exposes a WebSocket on port 34872. Written in Rust for performance and reliability (tokio, tungstenite, rmp-serde).
  2. Luau plugin (--!strict) — installed in Roblox Studio. Connects to the daemon over WebSocket, pushes Studio-side changes, and applies disk-side changes.
  3. TypeScript extension (strict) — for VS Code and Antigravity. Handles the editor experience, commands, and IDE integration.

Current wire format is JSON (Phase 0); plan is to migrate to MessagePack to cut overhead.

Mini documentation

Install

1. Daemon (required) Grab the daemon binary from the latest GitHub release: :backhand_index_pointing_right: GitHub - conception-world/Yeet · GitHub

Drop yeet-daemon somewhere accessible (project folder or PATH). It runs in the background and handles the sync.

2. Studio plugin Install from the Creator Store: :backhand_index_pointing_right: https://create.roblox.com/store/asset/126422641897714/Yeet

3. VS Code / Antigravity extension Install from the Marketplace: :backhand_index_pointing_right: Yeet - Visual Studio Marketplace

Basic usage

  1. Open your project in VS Code (or Antigravity).
  2. Start the daemon (the extension can do this for you).
  3. Open Roblox Studio and enable the Yeet plugin — it will connect to the daemon.
  4. Edit a .lua / .luau file on either side → the change shows up on the other.
  5. On conflict, the plugin opens a 3-pane view (disk version, Studio version, merged result) so you can resolve it manually.

Starting from scratch or from an existing project

  • New project: create the folder structure following the Rojo layout (src/, default.project.json, etc.) and let Yeet populate Studio.
  • Existing Studio project: use Reverse Bootstrap from the plugin UI. It generates the on-disk files from the current DataModel.

Useful links

How I’m using Yeet in my own projects

I currently use Yeet to develop several games in parallel, and this is one of the tool’s biggest strengths in my workflow.

1. Instant code migration between Studio and editor

Before Yeet, every time I wanted to work on a project outside of Studio I had to download a copy of the place, export scripts, set up Rojo, and so on. With Yeet I just connect and all the code goes straight into Antigravity — no manual export step. That dramatically lowers the friction of starting (or picking back up) work on any project.

2. Reusing packages without Rojo + Wally

This was the biggest win for me. I used to rely on Rojo + Wally to manage packages, and that added a lot of complexity whenever I spun up a new project.

My workflow today is much simpler:

  • I keep one central folder with all my packages already organized.
  • When I start a new project (or want to bring a package into another project), I use a few Claude Code skills to automatically migrate packages from one folder to another.
  • Yeet then syncs everything into Studio.

The result: zero Wally configuration, zero Rojo setup, zero headaches when creating new projects. I literally open a new project, drop in the packages I need, and I’m already coding.

7 Likes

Ohh, this looks great.
I’ve always had problems with Rojo, mainly because of synchronization issues and lost scripts due to unstable two-way synchronization.

I’ll give this a try later!

1 Like

Interesting!

What it uses as a source of truth? Roblox Studio?

Yeet does not have a permanent single source of truth. In normal live sync, the daemon is the sync authority: it tracks the last synced base, compares Studio and filesystem trees, and arbitrates changes. During bootstrap/bulk sync flows, the user can explicitly choose a side, for example, Studio can become the source of truth when generating the filesystem from an existing DataModel. In conflicts, Yeet intentionally avoids silent overwrites and asks the user to resolve the merge.

That seems nice!

I’ll for sure take a look at it later! Thanks for answering :slight_smile:

1 Like