[UPDATED] Specty-Chat Box
Key RequiredUniversal

[UPDATED] Specty-Chat Box

Universal ScriptSpectravaxISBACKSpectravaxISBACK 764 views 128 executesUpdated Jan 17, 2026
2.5/ 5(2 votes)
1150% Positive
Lua Script•326 lines (12641 chars)
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local TextService = game:GetService("TextService")
local UserInputService = game:GetService("UserInputService")
local VoiceChatService = game:GetService("VoiceChatService")

local player = Players.LocalPlayer
shared.__FAKE_CHAT_BUS = shared.__FAKE_CHAT_BUS or { Messages = {}, Event = Instance.new("BindableEvent") }
local ChatBus = shared.__FAKE_CHAT_BUS

local gui = Instance.new("ScreenGui")
gui.Name = "TopbarPlusChat"
gui.ResetOnSpawn = false
gui.Parent = game.CoreGui

local topButton = Instance.new("ImageButton")
topButton.Size = UDim2.new(0,36,0,36)
topButton.BackgroundColor3 = Color3.fromRGB(30,30,30)
topButton.BorderSizePixel = 0
topButton.Image = "rbxassetid://88317614019211"
topButton.Parent = gui
Instance.new("UICorner", topButton).CornerRadius = UDim.new(1,0)

local function updateTopbarPosition()
    local hasVoice = false
    pcall(function()
        hasVoice = VoiceChatService:IsVoiceEnabledForUserId(player.UserId)
    end)
    if hasVoice then
        topButton.AnchorPoint = Vector2.new(0.5,0)
        topButton.Position = UDim2.new(0.5,0,0,6)
    else
        topButton.AnchorPoint = Vector2.new(0,0)
        topButton.Position = UDim2.new(0,6,0,6)
    end
end

task.spawn(function()
    while true do
        updateTopbarPosition()
        task.wait(5)
    end
end)

local chatFrame = Instance.new("Frame")
chatFrame.Size = UDim2.new(0, math.min(300, workspace.CurrentCamera.ViewportSize.X * 0.9), 0, math.min(320, workspace.CurrentCamera.ViewportSize.Y * 0.8))
chatFrame.Position = UDim2.new(0.05,0,0.1,0)
chatFrame.BackgroundColor3 = Color3.fromRGB(20,20,20)
chatFrame.BackgroundTransparency = 0.4
chatFrame.Visible = false
chatFrame.Parent = gui
Instance.new("UICorner", chatFrame).CornerRadius = UDim.new(0,12)

local title = Instance.new("TextLabel")
title.Text = "SpectyChat Box"
title.Size = UDim2.new(1,-10,0,30)
title.Position = UDim2.new(0,5,0,5)
title.BackgroundTransparency = 1
title.TextColor3 = Color3.new(1,1,1)
title.Font = Enum.Font.Arial
title.TextSize = 16
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = chatFrame

local infoButton = Instance.new("ImageButton")
infoButton.Size = UDim2.new(0,22,0,22)
infoButton.Position = UDim2.new(1,-32,0,9)
infoButton.BackgroundColor3 = Color3.fromRGB(0,0,0)
infoButton.BorderSizePixel = 0
infoButton.Image = "rbxassetid://5832745500"
infoButton.Parent = chatFrame
Instance.new("UICorner", infoButton).CornerRadius = UDim.new(1,0)

local scroll = Instance.new("ScrollingFrame")
scroll.Position = UDim2.new(0,10,0,40)
scroll.Size = UDim2.new(1,-20,1,-120)
scroll.CanvasSize = UDim2.new(0,0,0,0)
scroll.BackgroundTransparency = 1
scroll.BorderSizePixel = 0
scroll.ScrollBarImageTransparency = 0.4
scroll.Parent = chatFrame

local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0,6)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = scroll

local infoFrame = Instance.new("Frame")
infoFrame.Size = scroll.Size
infoFrame.Position = scroll.Position
infoFrame.BackgroundTransparency = 1
infoFrame.Visible = false
infoFrame.Parent = chatFrame

local infoScroll = Instance.new("ScrollingFrame")
infoScroll.Size = UDim2.new(1,0,1,0)
infoScroll.CanvasSize = UDim2.new(0,0,0,0)
infoScroll.ScrollBarImageTransparency = 0.4
infoScroll.BackgroundTransparency = 1
infoScroll.BorderSizePixel = 0
infoScroll.Parent = infoFrame

local infoLayout = Instance.new("UIListLayout")
infoLayout.Padding = UDim.new(0,10)
infoLayout.Parent = infoScroll

local function addInfoText(text)
    local lbl = Instance.new("TextLabel")
    lbl.Size = UDim2.new(1,-10,0,0)
    lbl.BackgroundTransparency = 1
    lbl.TextWrapped = true
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextYAlignment = Enum.TextYAlignment.Top
    lbl.Font = Enum.Font.Arial
    lbl.TextSize = 14
    lbl.TextColor3 = Color3.new(1,1,1)
    lbl.Text = text
    lbl.Parent = infoScroll
    local width = infoScroll.AbsoluteSize.X
    if width == 0 then width = 300 end
    lbl.Size = UDim2.new(1,-10,0,TextService:GetTextSize(text,14,lbl.Font,Vector2.new(width,9999)).Y+4)
    infoScroll.CanvasSize = UDim2.new(0,0,0,infoLayout.AbsoluteContentSize.Y+6)
end

addInfoText("1. Friends appear in RED.")
addInfoText("2. Bots appear in WHITE.")
addInfoText("3. Made by SpectravaxISBACK.")

local box = Instance.new("TextBox")
box.Size = UDim2.new(1,-90,0,34)
box.Position = UDim2.new(0,10,1,-90)
box.BackgroundColor3 = Color3.fromRGB(25,25,25)
box.TextColor3 = Color3.new(1,1,1)
box.PlaceholderText = "Tap here to chat or press the / key..."
box.ClearTextOnFocus = false
box.Font = Enum.Font.Arial
box.TextSize = 14
box.Parent = chatFrame
Instance.new("UICorner", box).CornerRadius = UDim.new(0,8)

local send = Instance.new("TextButton")
send.Size = UDim2.new(0,60,0,34)
send.Position = UDim2.new(1,-70,1,-90)
send.Text = "Send"
send.Font = Enum.Font.Arial
send.TextSize = 14
send.TextColor3 = Color3.new(1,1,1)
send.BackgroundColor3 = Color3.fromRGB(40,40,40)
send.Parent = chatFrame
Instance.new("UICorner", send).CornerRadius = UDim.new(0,8)

local typingLabel = Instance.new("TextLabel")
typingLabel.Size = UDim2.new(1,-20,0,20)
typingLabel.Position = UDim2.new(0,10,1,-55)
typingLabel.BackgroundTransparency = 1
typingLabel.TextColor3 = Color3.new(1,1,1)
typingLabel.Font = Enum.Font.Arial
typingLabel.TextSize = 14
typingLabel.TextXAlignment = Enum.TextXAlignment.Left
typingLabel.Text = ""
typingLabel.Parent = chatFrame

topButton.MouseButton1Click:Connect(function()
    chatFrame.Visible = not chatFrame.Visible
end)

-- Bot Names/Phrases with fallback
local botNamesUrl = "https://raw.githubusercontent.com/deedlemcdoodledeedlemcdoodle-creator/Names_and_Phrases/refs/heads/main/bot_names.txt"
local botPhrasesUrl = "https://raw.githubusercontent.com/deedlemcdoodledeedlemcdoodle-creator/Names_and_Phrases/refs/heads/main/bot_phrases.txt"

local botNames, botPhrases = {}, {}
pcall(function()
    botNames = string.split(HttpService:GetAsync(botNamesUrl), "\n")
    botPhrases = string.split(HttpService:GetAsync(botPhrasesUrl), "\n")
end)

if #botNames == 0 then 
    botNames = {"NoodleLUCKisreal:", "WhoAteMyToaster:", "MrBreasty:", "iCantChat:", "jfjdjsidjcbsjsba:", "V4MP:", "ST4R:"} 
end

if #botPhrases == 0 then 
    botPhrases = {
        "Hello everyone!", "What's up?", "Anyone here?", "Nice chat!", 
        "Finally, we don't need face id!!", "This is awesome, good job!", "I love this game!", 
        "Who wants to play some Roblox together?", "Just finished a really fun obby!", 
        "This chat is so cool!", "Can't believe we can finally chat without restrictions!", 
        "I just got a new skin, looks awesome!", "Anyone up for a race?", "Wow, this place is amazing!", 
        "I found a secret area in the game!", "Who wants to trade items?", "This game reminds me of the good old days!", 
        "I love hanging out here with friends!", "Finally, no face id needed!", "Let's start a group game!", 
        "Who wants to explore together?", "LOL, that was funny!", "I just got the highest score!", 
        "This is so relaxing!", "I love customizing my avatar!", "Who else is playing this today?", 
        "Finally, chat is back!", "I can't stop laughing!", "Anyone knows a good obby?", 
        "This game is perfect for chill time!", "I just found a rare item!", "Finally, we can all chat freely!", 
        "Who's up for some mini-games?", "I love the community here!", "Just joined, hi everyone!", 
        "Finally, no more face id problems!", "Let's play together!", "This is the best script ever!", 
        "I just completed a challenge!", "Who's online right now?", "I found a cool trick in this game!", 
        "This chat is so fun!", "Finally, we can chat without limits!", "Anyone wants to team up?", 
        "I love how smooth everything is!", "Who wants to join my game?", "Finally, we can enjoy chatting!", 
        "This makes the game way more fun!", "I just unlocked a new area!", "Let's have some fun!", 
        "I love the graphics in this game!", "Anyone wants to build something together?", "Finally, chatting made easy!", 
        "LOL, that was hilarious!", "I just got a new badge!", "Who's ready for a game night?", 
        "I love playing with friends here!", "Finally, no more restrictions!", "Let's make a team!", 
        "This chat is amazing!", "I just discovered something cool!", "Who wants to hang out?", 
        "Finally, free chat for everyone!", "This game is super fun!", "I love exploring here!", 
        "Anyone wants to race?", "Finally, no face id needed again!", "Let's have some fun together!", 
        "I just got a rare pet!", "This script is so useful!", "Who wants to join a party?", 
        "Finally, we can chat without worries!", "I love the friendly vibes here!", "This game is so cozy!", 
        "Anyone wants to trade?", "Finally, chat for everyone!", "I just leveled up!", 
        "Let's play some fun games!", "This is so relaxing and fun!", "I love hanging out in this chat!", 
        "Finally, no face id troubles anymore!"
    } 
end

-- Friends
local friends = {}
pcall(function()
    for _,f in ipairs(player:GetFriendsAsync():GetCurrentPage()) do
        friends[f.Username] = true
        friends[f.DisplayName] = true
    end
end)

-- Add Message
local function addMessage(name,text)
    local isRed = friends[name] == true
    local lbl = Instance.new("TextLabel")
    lbl.BackgroundTransparency = 1
    lbl.TextWrapped = true
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextYAlignment = Enum.TextYAlignment.Top
    lbl.Font = Enum.Font.Arial
    lbl.TextSize = 14
    lbl.RichText = true
    local width = scroll.AbsoluteSize.X
    if width == 0 then width = 300 end
    if isRed then
        lbl.Text = string.format('<font color="#FF3333">%s</font>: <font color="#FFFFFF">%s</font>',name,text)
    else
        lbl.Text = string.format('<font color="#FFFFFF">%s</font>: <font color="#FFFFFF">%s</font>',name,text)
    end
    lbl.Size = UDim2.new(1,-10,0,TextService:GetTextSize(text,14,lbl.Font,Vector2.new(width,9999)).Y+4)
    lbl.Parent = scroll
    scroll.CanvasSize = UDim2.new(0,0,0,layout.AbsoluteContentSize.Y+6)
    scroll.CanvasPosition = Vector2.new(0,math.max(0,scroll.CanvasSize.Y.Offset-scroll.AbsoluteWindowSize.Y))
end

-- Send Button
send.MouseButton1Click:Connect(function()
    if box.Text ~= "" then
        local msg = {name=player.DisplayName,text=box.Text}
        table.insert(ChatBus.Messages,msg)
        ChatBus.Event:Fire(msg)
        box.Text = ""
    end
end)

-- Listen for new messages
ChatBus.Event.Event:Connect(function(msg)
    addMessage(msg.name,msg.text)
end)

-- Display old messages
for _,msg in ipairs(ChatBus.Messages) do
    addMessage(msg.name,msg.text)
end

-- Bot Messages
task.spawn(function()
    while true do
        local name = botNames[math.random(#botNames)]
        local text = botPhrases[math.random(#botPhrases)]
        local msg = {name=name,text=text}
        table.insert(ChatBus.Messages,msg)
        ChatBus.Event:Fire(msg)
        task.wait(math.random(1,4))
    end
end)

-- Typing Label
task.spawn(function()
    while true do
        local typingUsers = {}
        local numTyping = math.random(1,6)
        for i=1,numTyping do
            table.insert(typingUsers, botNames[math.random(#botNames)])
        end
        if #typingUsers == 0 then
            typingLabel.Text = ""
        elseif #typingUsers == 1 then
            typingLabel.Text = typingUsers[1].." is typing..."
        elseif #typingUsers > 4 then
            typingLabel.Text = "Several users are typing..."
        else
            local text = table.concat(typingUsers,", ")
            text = text:gsub(", ([^,]+)$"," and %1")
            typingLabel.Text = text.." are typing..."
        end
        task.wait(math.random(2,5))
        typingLabel.Text = ""
        task.wait(math.random(1,2))
    end
end)

-- Info Button
local showingInfo = false
infoButton.MouseButton1Click:Connect(function()
    showingInfo = not showingInfo
    if showingInfo then
        title.Text = "Informations"
        scroll.Visible = false
        infoFrame.Visible = true
    else
        title.Text = "SpectyChat Box"
        scroll.Visible = true
        infoFrame.Visible = false
    end
end)

-- Slash Key Open
UserInputService.InputBegan:Connect(function(input,gp)
    if gp then return end
    if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == Enum.KeyCode.Slash then
        if not chatFrame.Visible then chatFrame.Visible = true end
        box:CaptureFocus()
    end
end)

Features & Information

A Recreation of Roblox's Face ID Verification ChatBox but you can chat with fake chatters. Scripted/Created AND Modified by SpectravaxISBACK. Adds/Updates: Phrase Expanded Names Edited (to look Human look alike) More ( I don't know, too many things I just changed & modified. )
#RobloxScript#Spectravax#ChatBox#Chat#Spectravaxy

Community Comments (3)

yowtfyowtfJan 17, 2026

wtf bro its bots only

Replying to @yowtf
SpectravaxISBACKSpectravaxISBACKJan 17, 2026

@yowtf I'm sorry because of this, I will modify and fix the script.

yowtfyowtfJan 17, 2026

K

More Scripts for Universal Scripts