Version / Update: v1.0.0
- Download / Script Link
- --// Chat Spammer GUI (2025–2026 compatible)
--// Use at your own risk — most games detect & punish this very quickly
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local VirtualInputManager = game:GetService("VirtualInputManager")
local VirtualUser = game:GetService("VirtualUser")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
-- GUI
local sg = Instance.new("ScreenGui")
sg.Name = "ChatSpammer"
sg.ResetOnSpawn = false
sg.Parent = playerGui
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 340, 0, 360)
frame.Position = UDim2.new(0.5, -170, 0.5, -180)
frame.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
frame.BorderSizePixel = 0
frame.Parent = sg
local uicorner = Instance.new("UICorner")
uicorner.CornerRadius = UDim.new(0, 12)
uicorner.Parent = frame
-- Title
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -50, 0, 45)
title.BackgroundTransparency = 1
title.Text = "Chat Spammer"
title.TextColor3 = Color3.fromRGB(255, 90, 90)
title.Font = Enum.Font.GothamBold
title.TextSize = 22
title.TextXAlignment = Enum.TextXAlignment.Left
title.Position = UDim2.new(0, 12, 0, 0)
title.Parent = frame
-- Close button
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 34, 0, 34)
closeBtn.Position = UDim2.new(1, -40, 0, 6)
closeBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeBtn.Text = "X"
closeBtn.TextColor3 = Color3.new(1,1,1)
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 20
closeBtn.Parent = frame
Instance.new("UICorner", closeBtn).CornerRadius = UDim.new(0, 8)
closeBtn.MouseButton1Click:Connect(function()
sg:Destroy()
end)
-- Message box
local msgbox = Instance.new("TextBox")
msgbox.Size = UDim2.new(0.92, 0, 0, 44)
msgbox.Position = UDim2.new(0.04, 0, 0.14, 0)
msgbox.BackgroundColor3 = Color3.fromRGB(40, 40, 52)
msgbox.TextColor3 = Color3.new(1,1,1)
msgbox.PlaceholderText = "Message (blank = random numbers)"
msgbox.Text = ""
msgbox.Font = Enum.Font.Gotham
msgbox.TextSize = 17
msgbox.ClearTextOnFocus = false
msgbox.Parent = frame
Instance.new("UICorner", msgbox).CornerRadius = UDim.new(0, 8)
-- Delay
local delayLabel = Instance.new("TextLabel")
delayLabel.Size = UDim2.new(0.92, 0, 0, 24)
delayLabel.Position = UDim2.new(0.04, 0, 0.295, 0)
delayLabel.BackgroundTransparency = 1
delayLabel.Text = "Delay: 1.8 s (min 0.8 – max 6)"
delayLabel.TextColor3 = Color3.fromRGB(170, 170, 210)
delayLabel.Font = Enum.Font.Gotham
delayLabel.TextSize = 14
delayLabel.Parent = frame
local delayBox = Instance.new("TextBox")
delayBox.Size = UDim2.new(0.92, 0, 0, 36)
delayBox.Position = UDim2.new(0.04, 0, 0.36, 0)
delayBox.BackgroundColor3 = Color3.fromRGB(40, 40, 52)
delayBox.TextColor3 = Color3.new(1,1,1)
delayBox.Text = "1.8"
delayBox.Font = Enum.Font.Gotham
delayBox.TextSize = 17
delayBox.Parent = frame
Instance.new("UICorner", delayBox).CornerRadius = UDim.new(0, 8)
-- Toggle button
local toggle = Instance.new("TextButton")
toggle.Size = UDim2.new(0.92, 0, 0, 52)
toggle.Position = UDim2.new(0.04, 0, 0.49, 0)
toggle.BackgroundColor3 = Color3.fromRGB(55, 170, 55)
toggle.Text = "OFF – Click to START"
toggle.TextColor3 = Color3.new(1,1,1)
toggle.Font = Enum.Font.GothamBold
toggle.TextSize = 19
toggle.Parent = frame
Instance.new("UICorner", toggle).CornerRadius = UDim.new(0, 10)
-- Remotes display
local remotesLabel = Instance.new("TextLabel")
remotesLabel.Size = UDim2.new(0.92, 0, 0, 24)
remotesLabel.Position = UDim2.new(0.04, 0, 0.67, 0)
remotesLabel.BackgroundTransparency = 1
remotesLabel.Text = "Detected remotes: 0"
remotesLabel.TextColor3 = Color3.fromRGB(140, 190, 255)
remotesLabel.Font = Enum.Font.GothamSemibold
remotesLabel.TextSize = 14
remotesLabel.TextXAlignment = Enum.TextXAlignment.Left
remotesLabel.Parent = frame
local remotesScroll = Instance.new("ScrollingFrame")
remotesScroll.Size = UDim2.new(0.92, 0, 0, 78)
remotesScroll.Position = UDim2.new(0.04, 0, 0.74, 0)
remotesScroll.BackgroundColor3 = Color3.fromRGB(32, 32, 42)
remotesScroll.BorderSizePixel = 0
remotesScroll.ScrollBarThickness = 5
remotesScroll.CanvasSize = UDim2.new(0,0,0,0)
remotesScroll.Parent = frame
Instance.new("UICorner", remotesScroll).CornerRadius = UDim.new(0, 8)
local listLayout = Instance.new("UIListLayout")
listLayout.SortOrder = Enum.SortOrder.LayoutOrder
listLayout.Padding = UDim.new(0, 3)
listLayout.Parent = remotesScroll
-- Draggable
local dragging, dragStart, startPos
frame.InputBegan:Connect(function(input)
if not (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then return end
dragging = true
dragStart = input.Position
startPos = frame.Position
local conn; conn = input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
conn:Disconnect()
end
end)
end)
UserInputService.InputChanged:Connect(function(input)
if not dragging then return end
if not (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then return end
local delta = input.Position - dragStart
frame.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
end)
-- ────────────────────────────────────────────────
-- Logic
-- ────────────────────────────────────────────────
local spamActive = false
local chatRemotes = {}
local legacySay = nil
local zwsp = "\226\128\139"
local function updateRemotesUI()
for _, child in remotesScroll:GetChildren() do
if child:IsA("GuiObject") and child ~= listLayout then
child:Destroy()
end
end
local count = 0
for _, remote in chatRemotes do
count += 1
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(1, -8, 0, 22)
lbl.BackgroundTransparency = 1
lbl.Text = remote:GetFullName()
lbl.TextColor3 = Color3.fromRGB(210, 220, 255)
lbl.Font = Enum.Font.Gotham
lbl.TextSize = 13
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextTruncate = Enum.TextTruncate.SplitWord
lbl.Parent = remotesScroll
end
remotesScroll.CanvasSize = UDim2.new(0, 0, 0, count * 25)
remotesLabel.Text = "Detected remotes: " .. #chatRemotes .. (legacySay and " + legacy" or "")
end
local function scanChatRemotes()
chatRemotes = {}
local patterns = {"chat","say","message","msg","talk","send","speak","textchat","chatremote","saymessage"}
for _, obj in ReplicatedStorage:GetDescendants() do
if obj:IsA("RemoteEvent") then
local nameLower = obj.Name:lower()
for _, pat in patterns do
if nameLower:find(pat) then
table.insert(chatRemotes, obj)
break
end
end
end
end
local legacyFolder = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents", true)
legacySay = legacyFolder and legacyFolder:FindFirstChild("SayMessageRequest")
updateRemotesUI()
end
scanChatRemotes()
-- Better random message
local function getMessage()
if msgbox.Text ~= "" then
local r = math.random(1,5)
if r == 1 then return msgbox.Text .. zwsp end
if r == 2 then return zwsp .. msgbox.Text end
if r == 3 then return msgbox.Text .. " " end
return msgbox.Text
end
return "spam " .. math.random(10000,999999)
end
local function getDelayTime()
local num = tonumber(delayBox.Text)
return num and math.clamp(num, 0.8, 6) or 1.8
end
-- Main spam loop
task.spawn(function()
while true do
if spamActive then
local msg = getMessage()
local del = getDelayTime()
-- Attempt legacy (most common old system)
if legacySay then
pcall(function()
legacySay:FireServer(msg, "All")
end)
end
-- Fire all found remotes (with different argument orders)
for _, remote in chatRemotes do
task.spawn(function()
pcall(remote.FireServer, remote, msg, "All")
task.wait(0.03)
pcall(remote.FireServer, remote, "All", msg)
task.wait(0.03)
pcall(remote.FireServer, remote, msg)
end)
end
-- Optional: try to simulate real chat bar (unreliable in many games now)
--[[
pcall(function()
local chatGui = playerGui:FindFirstChild("Chat")
if chatGui then
local textbox = chatGui:FindFirstChildWhichIsA("TextBox", true)
if textbox then
textbox.Text = msg
VirtualInputManager:SendKeyEvent(true, Enum.KeyCode.Return, false, game)
task.wait(0.015)
VirtualInputManager:SendKeyEvent(false, Enum.KeyCode.Return, false, game)
end
end
end)
--]]
end
task.wait(getDelayTime())
end
end)
-- Toggle
toggle.MouseButton1Click:Connect(function()
spamActive = not spamActive
if spamActive then
toggle.Text = "STOP SPAMMING"
toggle.BackgroundColor3 = Color3.fromRGB(210, 60, 60)
else
toggle.Text = "START SPAMMING"
toggle.BackgroundColor3 = Color3.fromRGB(55, 170, 55)
end
end)
-- Update delay label when user finishes editing
delayBox.FocusLost:Connect(function(enterPressed)
local d = getDelayTime()
delayLabel.Text = string.format("Delay: %.1f s (min 0.8 – max 6)", d)
end)
-- Re-scan remotes every ~40 seconds
task.spawn(function()
while true do
task.wait(40)
scanChatRemotes()
end
end)
-- Simple anti-AFK (mouse right-click simulation – less detectable than camera move)
task.spawn(function()
while true do
pcall(function()
VirtualUser:Button2Down(Vector2.new())
task.wait(0.08)
VirtualUser:Button2Up(Vector2.new())
end)
task.wait(55 + math.random(-4,4)) -- ~50–60 seconds
end
end)
print("Chat spammer GUI loaded")[ View More ]
works all chatbox games also is good