Productivity plugin: script_io

…I was some sort of upset with the development of Script Sync, also set up of other tools did not inspire me because of their complexity… so here it goes:

script_io

A Roblox Studio plugin for two-way script synchronization between your Studio project and an external file system, with a built-in unified diff viewer.

Overview

script_io bridges your Roblox Studio scripts and local file system, enabling an external-editor workflow. It connects to a local HTTP server to sync your Lua scripts back and forth, compare changes, and review diffs — all without leaving Studio.

Key Features

  • Two-way sync: Save scripts from Studio to your local file system and load them back. The plugin tracks which scripts are new, changed, or removed using MD5 checksums.
  • Unified diff viewer: A dedicated dockable widget displays line-by-line diffs with color-coded additions, removals, and context lines. Includes in-diff search with navigation, whitespace error highlighting (trailing spaces, missing trailing newline), and a one-click whitespace fixer.
  • Selective hunk operations: Select multiple diff lines and choose to revert or save only those specific hunks — no need to apply an all-or-nothing approach.
  • Two connection modes:
    • Server mode: Connects to a local HTTP server (configurable port) to read/write scripts from your file system, request checksums, and fetch diffs.
    • Draft mode: Compares the committed .Source property of scripts against their live editor source, useful for reviewing unsaved changes before committing.
  • Bulk operations: Save all changed files or revert all changes in one action, with confirmation popups for safety.
  • Per-file actions: View diff, save, revert, delete, or load individual scripts directly from the status panel.
  • Script type awareness: Properly maps Script, LocalScript, and ModuleScript to distinct file extensions (.s.lua, .l.lua, .m.lua).
  • Hidden scripts list: Hide specific scripts from the change list so they won’t be included in bulk operations. The list is per-folder and persisted across sessions.
  • Studio theme integration: Automatically adapts to light/dark themes and updates on theme change.
  • Plugin action: A keyboard-shortcut-compatible action to instantly update the status and show the diff for the currently open script.
  • Configurable folder: Set the base folder path that maps to your project’s DataModel hierarchy for clean relative paths.

How it works

The plugin computes MD5 checksums of all LuaSourceContainer instances in your game and compares them against checksums from your file system (or committed source in draft mode). It then presents new, changed, and removed files in the status widget, where you can review diffs, save, revert, or delete them individually or in bulk.

Requirements

  • A local HTTP server running on your machine (for server mode) that exposes /save/, /load/, /checksums/, /diff/, and /delete/ endpoints to synchronize with local file system.

Get the plugin: https://create.roblox.com/store/asset/108632449188694/scriptiopublic
Get HTTP server (python script): GitHub - af2048/script_io_server: http server for Roblox plugin · GitHub

UI:

Required permissions:

  1. HTTP requests to the server’s port to sync with file system
  2. Script Injection is what this plugin does.

Limitations:

  • duplicated paths are not supported: there should be warnings in the output window. This is a price of keeping instances pristine in your experience: the plugin does not set any tags/attributes to track/identify them.
  • no automatic sync[!] with background checks/polls and so on: click “update status” button when needed

Warning!

  • the plugin can be destructive if used not correctly. Save you experience before pressing any button till you get used to the plugin.

To help with that:

  • in “draft” mode (with team create) revert/save require confirmation
  • in “server” mode only revert requires confirmation, it’s assumed that you have “protected” changes on file system with a version control system

You’ve been warned.

Questions? Issues? Leave a comment! Thanks!

3 Likes

Tutorials.

How to start:

  1. install plugin using studio
  2. create new experience, status widget will show something like this:
  3. get HTTP server script, and start it, for example, using this command line:
    python3 PATH_TO_THE_SCRIPT/script_io_server.py --port 8080 --dir PATH_TO_YOUR_ROBLOX_PROJECTS_DIRECTORY
    “current folder” defines directory in PATH_TO_YOUR_ROBLOX_PROJECTS_DIRECTORY where experience scripts will be saved. Storing projects in one directory in each own sub-directory allows running exactly one server and serving multiple experiences.
    You can change server port as well if default one conflicts with your environment.
  4. after starting the server, click “update status”, widget will show something like this:
  5. add a ModuleScript to ReplicatedStorage, and click “update status”, widget will show something like this:

    “delete” button removes script from the experience
  6. change “current folder” to test_project/scripts:
  7. click either “save all” or “save” against script name, widget updates automatically:

    file system at PATH_TO_YOUR_ROBLOX_PROJECTS_DIRECTORY will be changed to:
  8. add some text to the script:
  9. click “update status”:
  10. click view diff, diff widget opens:
  11. select several lines by using clicking left mouse button and dragging, after release “context menu” appears:

    Using the menu selection can be saved/reverted.
    If there are a lot of changes use mouse wheel to scroll to select more lines with a single drag action.
  12. delete ModuleScript from ReplicatedStorage and click “update status”:

    “delete” button removes script from the file system
  13. press “delete” (or “save all”) button, file system changes to:
    image

How to use “hidden files” feature:

  1. click script icon to add the script to the “hidden list”:
  2. widget changes to:
  3. click “show list of 1 hidden scripts”:
  4. click script icon again to unhide it:

Draft mode:

The problem is that in draft mode, using studio’s “Draft” window, partial commits are not possible: only full file commit/revert.
To solve this “draft” mode has been added to the plugin.
To switch modes use switch button:
image
in the “draft” mode widget’s title changes to “script_io[draft]” and port option disappears:
image
Following usage of save/revert work against scripts saved on Roblox server.
Please note that this flow does not create history entries as opposing to using “Commit” button in studio’s “Drafts” window. Not a big deal as for me.

great tool and plugin thanks for the contribution, especially the two way sync

1 Like

update:

  • cosmetic change: added port fade in/out when switching mode
  • cosmetic change: “view diff” button changes title to “close diff”
  • cosmetic change: added icon to toolbar button
  • fixed: infinite “busy” due to failed assertion after restoring script that has no parent
1 Like

update:

  • usability change: switch mode button moved to the left side of the widget, so there are less chances to click it instead of "“update status”:
    image
  • usability change: swapped “load” and “delete” buttons, so, among with “delete” and “save”, right buttons apply action to “remote”, left buttons apply action to experience
    image
  • plugins toolbar button is clickable from script editor also
  • changed context size of diff view in draft mode, so it’s aligned with server mode
  • now plugin supports spaces in instances name, credits go to @TheGrimDeathZombie for the hint
1 Like