Tag Manager: Tags With Edit Mode Functionality and Runtime Reloading

What is Tag Manager?

Tag Manager streamlines working with CollectionService tags by giving you up to 3 scripts per tag:

  • Server Script - Runs on the server for gameplay logic
  • Client Script - Runs on clients for visuals and effects
  • Edit Mode Script - Runs in Studio for tools and visualization

Only add what you need. Server-only tags? Just create a server script. Client-only? Just a client script. Mix and match as needed.


Core Features

:white_check_mark: Three Script Types Per Tag - Server, Client, and Edit Mode (add only what you need)
:white_check_mark: Simple Tag Management - Add/remove tags with one click
:white_check_mark: Enable/Disable Before Playtest - Toggle any script on/off
:white_check_mark: Edit Mode Script Reloading - Update edit scripts without restarting Studio
:white_check_mark: Optional Runtime Hot Reloading - Modify server/client scripts while the game is running
:white_check_mark: Runtime Tag Control - Enable/disable tags during playtesting
:white_check_mark: Automatic Cleanup - Removed() called automatically when objects are destroyed
:white_check_mark: Optional Whitelisting - Restrict tag observation to specific hierarchies
:white_check_mark: Module/Script Conversion - Toggle between ModuleScripts and Scripts without losing code
:white_check_mark: Clean UI - Everything accessible from one widget, no searching through Explorer


Getting Started

Creating Your First Tag

Adding a tag is simple: type the name and click the + button. To remove a tag and erase all its scripts, find it in the list and click the X button.
Tag Creation Demo

Setting Up Tag Behavior

Click on any tag in the list to open its configuration panel:


For each context (Server, Client, Edit Mode), you can:

  • Click the gear icon to open/create the script
  • Click the checkbox to enable/disable the script
  • Click the X to delete the script if you don’t need it

Script Management Demo

Edit Mode Script Reloading

Edit Mode scripts can be reloaded at any time during development. When you reload:

  1. The Removed() function of the old script is called
  2. The Added() function of the new script is called
  3. Changes apply immediately to all tagged objects

Example: Making tagged objects change color

In this example, I create a “Test” tag with an Edit Mode script. First, it makes objects red and removes the color when untagged. Then I modify it to make them yellow and reload the script - the changes apply instantly:

This is perfect for:

  • Building custom Studio tools
  • Creating visual helpers and gizmos
  • Validating tagged objects
  • Prototyping systems quickly

Pre-Playtest Tag Control

Before pressing Play, you can enable or disable any Server or Client script with a simple checkbox toggle. This is incredibly useful for:

  • Testing with/without specific mechanics
  • Disabling problematic systems during debugging
  • A/B testing different implementations
  • Gradually enabling features as you develop

Changes apply immediately when you start the playtest.


Runtime Interface

When you start playtesting, the widget switches to a runtime view showing all your tags separated into Server and Client lists. You can toggle tags on/off during the playtest without restarting.

Example: In this demo, I have a “Test” tag that makes objects green on the server and blue on the client. Watch how I can toggle them independently during runtime:

This makes iteration incredibly fast - no need to stop and restart just to test a different configuration.


Hot Reloading (Optional)

Want to take iteration speed to the next level? Enable Runtime Hot Reloading in the settings.

How to Enable

  1. Click the Settings button in the tag list
  2. Check the Runtime Hot-Reloading option
  3. The plugin updates your handler scripts to support reloading

Using Hot Reload

With hot reloading enabled, the runtime widget gains additional controls:

  • Reload button - Apply script changes instantly
  • Open script button - Jump directly to the script editor

Example: Using the same color-changing test tag, I can now modify the scripts during runtime and reload them. In this case, changing the colors from green/blue to different colors - all without stopping the playtest:

Note: Changes made during runtime with hot reload are temporary and will be lost when playtesting ends. This is intentional - it’s for rapid testing, not permanent changes.

When to Use Hot Reload

Enable it when:

  • Actively developing and iterating
  • Tweaking gameplay values
  • Testing different mechanics quickly
  • Prototyping new systems

Disable it for:

  • Published games
  • Performance-critical testing
  • Final playtests before release

It’s completely optional and can be toggled on/off with one click.


Optional Whitelisting

Want tags to only work in specific areas? Use the AncestorWhitelist:

local self = {}

-- Only observe tags under these instances
self.AncestorWhitelist = {
    workspace.GameArea,
    workspace.BossRoom
}

function self:Added(object: Instance)
    -- Only called for tagged objects inside GameArea or BossRoom!
end

function self:Removed(object: Instance)
   -- Called when object is deleted, tag is removed, or when its parented outside of GameArea or BossRoom!
end

return self

Use cases:

  • Restrict mechanics to specific zones
  • Separate test areas from production
  • Optimize performance by limiting observation scope
  • Create level-specific behaviors

Set to nil (default) to observe all tagged instances everywhere.


Additional Features

Module/Script Conversion

In the settings, you can convert handler scripts between ModuleScripts and regular Scripts with one click. The plugin automatically:

  • Wraps/unwraps your code with minimal changes
  • Preserves all your existing logic
  • Handles the conversion seamlessly

This is useful when:

  • Working with module loader systems
  • Transitioning projects between architectures
  • Experimenting with different setups

Automatic Parent Tracking

While the settings panel lets you select parent locations for handlers, you can also just move them in the Explorer - the plugin automatically detects and updates the location. No need to configure manually.

Default locations:

  • Server Handler: ServerScriptService
  • Client Handler: ReplicatedStorage
  • Plugin Handler: ServerStorage

Get Tag Manager

https://create.roblox.com/store/asset/123572046473398/Tag-Manager


Feedback & Questions

As always comment below for:

  • Feature requests or improvements
  • Any bugs or issues you encounter
  • Questions about implementation

link was broken for some reason, fixed it now

Updated the plugin, too tired to go into detail but basically i added the ability to disable and enable the plugin completely. disabling it will call :Removed() on all tags, remove the handlers, and clean up, basically as if the plugin never existed, it will still save any current tag scripts you have and will re add them in case you want to re enable it.

Another thing, I added a way to save tags and their related scripts into a persistent list, so that you can use them in any experience without needing to rewrite the code. the tag list for the current place has a new save button that saves the scripts to the saved tag list.


It will only save scripts that exist (ie if you only have a server side script, thats the only one it will save and load.).

You can see the current saved tags on a new widget, which is similar to the normal list. you can erase, modify inidiviual scripts, and load them into the experience, if the tag exists already, it will override it, if not it’ll create a new tag.

Im sure this plugin became more complex than i thought, and am considering making a quick tutorial showing how to use it.

fixed issue where disabling the plugin while in module mode breaks everything lel.

Did a complete rewrite of the plugin since it was to0 buggy to be usable, i temporaily removed tag saving and runtime reloading while i focus on getting the basics working. This should make the plugin actually useful now.

re added module conversion and handler code resets. I also made it more robust/“Idiot-proof” by:

Moving the handlers in the explorer will automatically save the new parent and handle related logic, so you dont need to set the parent from the settings page.

Renaming the handlers will also save the new name so the plugin can still find it.

Deleting a handler will not break anything, and attempting to add a script on a missing handler will just recreate it.

New update for the plugin:

  • Live Instance Viewer: Every tag now features a collapsible viewer list showing exactly what objects have that tag. It lets you click to select and focus your camera on the part, and includes quick-action hover buttons to instantly remove the tag or destroy the instance. It also syncs in real-time with your Studio selection!

  • Env Folder: I’ve added a folder under the plugin handler config where you can add any dependacies and library modules into it for your edit mode tag scripts to use, boiler code includes the reference, but if you have existing scripts, just add:

local env = script.Parent.Env

im thinking of adding color coded visualizers for tagged objects in the workspace, before re adding the tag saving functionality before finally moving on to work on my games.

New update:

3D Workspace Visualizer: Every tag now features a toggleable visualizer with a customizable color picker! Turning this on will highlight every instance with that tag directly in your 3D workspace. You can visualize multiple tags at the same time, and the highlight colors will update in real-time as you tweak them.

Quick Selection Tools: I’ve added three new dedicated workflow buttons to every tag’s dashboard to speed up mass-editing. “Select Tagged” instantly grabs every instance with that tag in your Explorer, “Tag Selected” applies the current tag to whatever parts you are currently holding, and “Untag Selected” removes it. You never have to leave the plugin menu to manage your workspace again!

only thing left is the cross place tag saving.

fixed a glaring issue where the ui wouldnt load for existing tags when loading a place with existing scripts, sorry

I added a global toggle that loads and unloads the plugin when needed, now any new places or experiences that havent been loaded already will stay disabled and not create the new instances until you toggle them on. I also fixed some leaks and issues where the first time it loads twice, plus some smaller issues with the UI not reflecting the state of any pre-existing tags properly

Procedural Models

There’s goes this plugin’s defining feature :sob::sob::sob:.

If the instances turn out to be a lot easier than the tag method then ill either covert the plugin to use these or just leave it as a glorified tag script storage plugin.