Run it
Copy the script and paste it into your executor.
players = :()
player = players.LocalPlayer
playerGui = player:()
logService = :()
userInputService = :()
runService = :()
tweenService = :()
httpService = :()
maxLogEntries =
logThrottleTime =
font = Font.()
touchThreshold =
isMobile = userInputService.TouchEnabled userInputService.MouseEnabled
isDesktop = userInputService.MouseEnabled isMobile
uiConfig = {
desktop = {
size = .(, , , ),
position = .(, , , ),
fontSize = ,
headerHeight = ,
scrollBarThickness =
},
mobile = {
size = .(, , , ),
position = .(, , , ),
fontSize = ,
headerHeight = ,
scrollBarThickness =
}
}
currentConfig = isMobile uiConfig.mobile uiConfig.desktop
colors = {
info = .(, , ),
warning = .(, , ),
= .(, , ),
debug = .(, , ),
system = .(, , ),
success = .(, , ),
background = .(, , ),
header = .(, , )
}
:()
.Loaded:()
playerGui:()
playerGui.LogUI:()
()
screenGui = .()
screenGui.Name =
screenGui.ResetOnSpawn =
screenGui.IgnoreGuiInset =
screenGui.DisplayOrder =
screenGui.Parent = playerGui
mainFrame = .()
mainFrame.Name =
mainFrame.AnchorPoint = .(, )
mainFrame.Position = currentConfig.position
mainFrame.Size = currentConfig.size
mainFrame.BackgroundColor3 = colors.background
mainFrame.BackgroundTransparency =
mainFrame.Parent = screenGui
corner = .()
corner.CornerRadius = .(, )
corner.Parent = mainFrame
header = .()
header.Name =
header.Size = .(, , , currentConfig.headerHeight)
header.BackgroundColor3 = colors.header
header.BackgroundTransparency =
header.Parent = mainFrame
headerCorner = .()
headerCorner.CornerRadius = .(, )
headerCorner.Parent = header
title = .()
title.Name =
title.Size = .(, -, , )
title.Position = .(, , , )
title.Text =
title.TextColor3 = .(, , )
title.FontFace = font
title.TextSize = currentConfig.fontSize
title.TextXAlignment = .TextXAlignment.Left
title.BackgroundTransparency =
title.Parent = header
closeButton = .()
closeButton.Name =
closeButton.Size = .(, currentConfig.headerHeight - , , currentConfig.headerHeight - )
closeButton.Position = .(, -currentConfig.headerHeight, , )
closeButton.AnchorPoint = .(, )
closeButton.Text =
closeButton.TextColor3 = .(, , )
closeButton.TextSize = currentConfig.fontSize +
closeButton.FontFace = font
closeButton.BackgroundTransparency =
closeButton.BackgroundColor3 = .(, , )
closeButton.Parent = header
closeCorner = .()
closeCorner.CornerRadius = .(, )
closeCorner.Parent = closeButton
logContainer = .()
logContainer.Name =
logContainer.Size = .(, -, , -currentConfig.headerHeight - )
logContainer.Position = .(, , , currentConfig.headerHeight + )
logContainer.BackgroundTransparency =
logContainer.BorderSizePixel =
logContainer.ScrollBarThickness = currentConfig.scrollBarThickness
logContainer.ScrollBarImageColor3 = .(, , )
logContainer.CanvasSize = .(, , , )
logContainer.AutomaticCanvasSize = .AutomaticSize.Y
logContainer.ScrollingDirection = .ScrollingDirection.Y
logContainer.VerticalScrollBarInset = .ScrollBarInset.ScrollBar
logContainer.Parent = mainFrame
layout = .()
layout.Padding = .(, )
layout.SortOrder = .SortOrder.LayoutOrder
layout.Parent = logContainer
padding = .()
padding.PaddingTop = .(, )
padding.PaddingBottom = .(, )
padding.PaddingLeft = .(, )
padding.PaddingRight = .(, )
padding.Parent = logContainer
dragging =
dragStartPos, frameStartPos
touchStartPos, touchStartTime
(input)
input.UserInputType == .UserInputType.MouseButton1
input.UserInputType == .UserInputType.Touch
dragging =
dragStartPos = input.Position
frameStartPos = mainFrame.Position
isMobile
touchStartPos = input.Position
touchStartTime = .()
connection
connection = input.Changed:(()
input.UserInputState == .UserInputState.End
dragging =
connection
connection:()
)
(input)
isMobile
duration = .() - touchStartTime
distance = (input.Position - touchStartPos).Magnitude
duration < distance < touchThreshold
header.InputBegan:(handleDragStart)
userInputService.InputChanged:((input)
dragging (input.UserInputType == .UserInputType.MouseMovement
input.UserInputType == .UserInputType.Touch)
isMobile (input)
delta = input.Position - dragStartPos
mainFrame.Position = .(
frameStartPos.X.Scale,
frameStartPos.X.Offset + delta.X,
frameStartPos.Y.Scale,
frameStartPos.Y.Offset + delta.Y
)
)
()
screenGui.Enabled = screenGui.Enabled
tween = tweenService:(
closeButton,
TweenInfo.(, .EasingStyle.Quad, .EasingDirection.Out),
{BackgroundTransparency = screenGui.Enabled }
)
tween:()
closeButton.Activated:(toggleUI)
logEntries = {}
lastLogTime =
logQueue = {}
()
#logEntries > maxLogEntries
oldest = .(logEntries, )
oldest
oldest:()
(message, logType, timestamp)
timestamp = timestamp .()
logFrame = .()
logFrame.BackgroundColor3 = .(, , )
logFrame.BackgroundTransparency =
logFrame.Size = .(, -, , )
logFrame.AutomaticSize = .AutomaticSize.Y
logFrame.LayoutOrder = timestamp
logFrame.Parent = logContainer
lofFrame.Name =
corner = .()
corner.CornerRadius = .(, )
corner.Parent = logFrame
padding = .()
padding.PaddingTop = .(, isMobile )
padding.PaddingBottom = .(, isMobile )
padding.PaddingLeft = .(, isMobile )
padding.PaddingRight = .(, isMobile )
padding.Parent = logFrame
typeIndicator = .()
typeIndicator.Size = .(, isMobile , , )
typeIndicator.BackgroundColor3 = colors[logType] colors.info
typeIndicator.BorderSizePixel =
typeIndicator.Parent = logFrame
typeIndicator.Name =
timeText = .()
timeText.Size = .(, isMobile , , isMobile )
timeText.Position = .(, isMobile , , isMobile )
timeText.Text = .(, timestamp)
timeText.TextColor3 = .(, , )
timeText.FontFace = font
timeText.TextSize = isMobile currentConfig.fontSize - currentConfig.fontSize -
timeText.TextXAlignment = .TextXAlignment.Left
timeText.BackgroundTransparency =
timeText.Parent = logFrame
timeText.Name =
label = .()
label.Size = .(, isMobile - -, , )
label.Position = .(, isMobile , , isMobile )
label.Text = message
label.TextColor3 = colors[logType] colors.info
label.FontFace = font
label.TextSize = currentConfig.fontSize
label.TextXAlignment = .TextXAlignment.Left
label.TextYAlignment = .TextYAlignment.Top
label.TextWrapped =
label.AutomaticSize = .AutomaticSize.Y
label.BackgroundTransparency =
label.Parent = logFrame
labal.Name =
.(logEntries, logFrame)
()
logContainer.CanvasPosition.Y >= logContainer.CanvasSize.Y.Offset - logContainer.AbsoluteSize.Y -
runService.Heartbeat:()
logContainer.CanvasPosition = .(, logContainer.CanvasSize.Y.Offset)
()
now = .()
#logQueue > now - lastLogTime >= logThrottleTime
log = .(logQueue, )
(log.message, log.logType, log.timestamp)
lastLogTime = now
.(logThrottleTime)
.(processLogQueue)
{
screenGui = screenGui,
addLog = (message, logType, timestamp)
.(logQueue, {
message = message,
logType = logType ,
timestamp = timestamp .()
})
}
logUI = ()
typeMap = {
[.MessageType.MessageOutput] = ,
[.MessageType.MessageInfo] = ,
[.MessageType.MessageWarning] = ,
[.MessageType.MessageError] =
}
logService.MessageOut:((message, messageType)
logUI.(message, typeMap[messageType] )
)
logs = {}
logs.log = (message, logType)
logUI.(message, logType )
logs.info = (message)
logUI.(message, )
logs.warn = (message)
logUI.(message, )
logs.error = (message)
logUI.(message, )
logs.success = (message)
logUI.(message, )
logs.system = (message)
logUI.( .. message, )
isMobile
logs.show = ()
logUI.screenGui.Enabled =
logs.hide = ()
logUI.screenGui.Enabled =
logs.toggle = ()
logUI.screenGui.Enabled = logUI.screenGui.Enabled
logs### Log Viewer Update - V1.2 **Changes and Improvements:** 1. **Removed Console Support** - Deleted all console-specific code (Xbox/PlayStation) since it wasn't needed - Removed `GuiService` dependencies 2. **Consistent Naming Convention** - Changed all variables to **lowercase** (e.g., `LogService` → `logService`) - Updated color references to match (e.g., `COLORS.Info` → `colors.info`) 3. **Mobile Improvements** - Better touch responsiveness with adjusted thresholds - Larger tap area for mobile buttons - Optimized font sizes for mobile readability 4. **Performance Optimizations** - Reduced log rendering overhead - Smoother scrolling with throttled updates 5. **UI Tweaks** - Changed title from "SYSTEM LOGS" to "System Logs" - Cleaned up close button animation 6. **Bug Fixes** - Fixed rare drag interaction lock - Corrected log container padding on mobile - Ensured logs auto-scroll properly