Easily Customize Chat Tags, Chat Window, & New Bubble Chat Without Forking!

Easy Chat Customization in 1 Model!
Hello, forum! This is my first resource. I decided to combine all your chat customization needs into 1 model, in 1 place! And guess what, you don’t need to fork the chat. Simple and easy!
This contains 2 scripts: A local script and a server script. Everything is commented and all settings are set to their defaults.

Local Script: (ClientChatScript)
This script controls the Chat Window and Bubble Chat customization. Every setting is set to default, and commented with its description, data type, and default value. This should be dragged into ReplicatedFirst.

Server Script: (ServerChatScript)
This script will set the chat tags that you have set on the server side. This doesn’t need to be touched. Drag this into ServerScriptService.

Local Script: (ClientChatScript)
This script will set the properties that you have set on the client side. This doesn’t need to be touched. This should be dragged into ReplicatedFirst.

Module Script: (ChatSettings)
This is what you will be editing. This contains all of the settings. Just drag this into ReplicatedStorage. This controls the chat window, bubble chat, and chat tags, and has instructions easily commented!

Setup is SUPER simple and easy! Just take the model:

Drag the ClientChatScript into ReplicatedFirst, the ServerChatScript into ServerScriptService, the ChatSettings module into ReplicatedStorage, and start customizing!

And here’s an uncopylocked place demo to show how to set it up:

This is my first resource, so let me know if anything is incorrect or broken! Thanks!


Okay thank you Im gonna try it

1 Like

Regarding this line of code:

local player = Players:FindFirstChild(playerName)
if not player then return end

ChatSpeakers have a GetPlayer method that’s more recommended for use instead. ChatSpeakers can belong to both player and non-player entities plus this is the canonical way to check if a ChatSpeaker is associated with a player and if so get a direct reference to the Player object.

local player = Speaker:GetPlayer()
if not player then return end

I noticed this function is called with SpeakerAdded but there’s an unnecessary double function layer here. SpeakerAdded fires with the name of the speaker, so what you should be doing instead is connecting the function directly, no anonymous functions.

for _, speaker in ipairs(ChatService:GetSpeakerList()) do

The game pass and badge tags could use less hard coding. You got the dictionary part down pat, but if this is meant to be an easily customisable chat tags script then you’ll also want to make the script account for removed or new tags. An additional field you could add is a type so it can check whether to use BadgeService or MarketplaceService to evaluate ownership of the given asset.


Thanks for the feedback! I’ll change it when I get the opportunity.

Hey everyone! I’ve updated the model with some better code. I took the suggestions from @colbert2677 and added some new stuff! Now, all the settings are in one, yes you heard right one module! There are still the server and client scripts, but those just call some functions. Now you don’t have to edit those! You can find all the settings you need, neatly labeled, in that module.

I don’t recommend using this since if Roblox makes updates to the Chat Module, games will not be updated since there is no auto update mechanism for this.

It’s really easy to turn on the new bubble chat anyways, you don’t need a third party module for it.

The default chat module has functions commented as well.

Again you can control this with the default chat module.

Only thing that this might be useful for is chat tags.

Default chat module? Where do you find that?

Sorry, this is my first resource.

This isn’t for turning it on, it’s supposed to put everything in 1 model to customize it.

You could literally fire up a game with Explorer open and copy everything in the Chat folder. Stop testing and paste it back into the Chat folder.

That’s forking the chat. Guess I should’ve titled it differently. This is meant for doing it without forking.

How did it work out for you?

P.S. I updated it to make it easier to edit.

This is actually the opposite. If you fork the Lua Chat System, then the components you’ve forked will stop receiving automatic updates. This resource is using the public API exposed by the ChatService and its classes in order to create a non-forked chat tag system, which is good.

The bubble chat that’s enabled in this resource is the pre-Roact bubble chat, which is rendered via a LocalScript as crisper bubbles. The BubbleChatEnabled property in the Chat service enables the new bubble chat. They’re two different bubble chat systems.

It already is a recommendation that you use the given API to modify these settings rather than fork. Forking should only be done in cases where you are making major technical changes or changes that can’t otherwise be committed without forking. You don’t and shouldn’t need the “default modules” here when you can change the settings and create widgets for the chat system via the API.

I fully recommend using this, or anything similar, if you want chat tags or more customisability on the Lua Chat System. You can find more documentation on the Developer Hub, Lua Chat System.

1 Like

Okay I just dknoaded it yesterday but haven’t used it yet I’m gonna use it later and see how it goes

1 Like
Attempt to index nil with 'Tag' Script 'ReplicatedStorage.Scripts.ChatSettings', Line 181 - function SetUpChatTags Script 'ServerScriptService.ServerChatScript', Line 7```
1 Like

Hey guys! Sorry that I haven’t been able to properly maintain this. I’m working on an update to fix some bugs like @stevenfury91 pointed out!