Linux Executor V2
Key RequiredUniversal

Linux Executor V2

Universal ScriptEducationalistEducationalist 3K views 182 executesUpdated Feb 7, 2026
Unrated
00
Lua Script•1581 lines (54920 chars)
-- Linux Executor v2.0 | Client-Side | Mobile Support
-- Full-featured executor UI with animations

-- Services
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local HttpService = game:GetService("HttpService")

local Player = Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")

-- Detect Mobile
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled

-- Remove existing UI if re-executed
if PlayerGui:FindFirstChild("LinuxExecutor") then
    PlayerGui:FindFirstChild("LinuxExecutor"):Destroy()
end

-- ═══════════════════════════════════════════
-- THEME CONFIG
-- ═══════════════════════════════════════════
local Theme = {
    Background = Color3.fromRGB(18, 18, 24),
    TopBar = Color3.fromRGB(12, 12, 18),
    Sidebar = Color3.fromRGB(22, 22, 30),
    Editor = Color3.fromRGB(25, 25, 35),
    EditorLineBar = Color3.fromRGB(20, 20, 28),
    Accent = Color3.fromRGB(0, 180, 120),
    AccentHover = Color3.fromRGB(0, 210, 140),
    AccentDark = Color3.fromRGB(0, 140, 95),
    Text = Color3.fromRGB(220, 220, 230),
    TextDim = Color3.fromRGB(130, 130, 150),
    TextLineNum = Color3.fromRGB(80, 80, 110),
    ButtonBG = Color3.fromRGB(35, 35, 50),
    ButtonHover = Color3.fromRGB(45, 45, 65),
    TabActive = Color3.fromRGB(0, 180, 120),
    TabInactive = Color3.fromRGB(35, 35, 50),
    Console = Color3.fromRGB(20, 20, 28),
    ConsoleText = Color3.fromRGB(0, 200, 130),
    Error = Color3.fromRGB(255, 80, 80),
    Warning = Color3.fromRGB(255, 200, 50),
    Border = Color3.fromRGB(40, 40, 55),
    ScrollBar = Color3.fromRGB(0, 150, 100),
    Close = Color3.fromRGB(255, 60, 60),
    Minimize = Color3.fromRGB(255, 190, 50),
    Maximize = Color3.fromRGB(0, 200, 80),
}

-- ═══════════════════════════════════════════
-- UTILITY FUNCTIONS
-- ═══════════════════════════════════════════
local function CreateCorner(parent, radius)
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, radius or 8)
    corner.Parent = parent
    return corner
end

local function CreateStroke(parent, color, thickness)
    local stroke = Instance.new("UIStroke")
    stroke.Color = color or Theme.Border
    stroke.Thickness = thickness or 1
    stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
    stroke.Parent = parent
    return stroke
end

local function CreateShadow(parent)
    local shadow = Instance.new("ImageLabel")
    shadow.Name = "Shadow"
    shadow.BackgroundTransparency = 1
    shadow.Image = "rbxassetid://5554236805"
    shadow.ImageColor3 = Color3.fromRGB(0, 0, 0)
    shadow.ImageTransparency = 0.5
    shadow.ScaleType = Enum.ScaleType.Slice
    shadow.SliceCenter = Rect.new(23, 23, 277, 277)
    shadow.Size = UDim2.new(1, 30, 1, 30)
    shadow.Position = UDim2.new(0, -15, 0, -15)
    shadow.ZIndex = parent.ZIndex - 1
    shadow.Parent = parent
    return shadow
end

local function Tween(obj, props, duration, style, direction)
    local tween = TweenService:Create(obj, TweenInfo.new(
        duration or 0.3,
        style or Enum.EasingStyle.Quint,
        direction or Enum.EasingDirection.Out
    ), props)
    tween:Play()
    return tween
end

local function RippleEffect(button, x, y)
    local ripple = Instance.new("Frame")
    ripple.Name = "Ripple"
    ripple.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    ripple.BackgroundTransparency = 0.7
    ripple.BorderSizePixel = 0
    ripple.ZIndex = button.ZIndex + 5
    ripple.AnchorPoint = Vector2.new(0.5, 0.5)
    
    local absPos = button.AbsolutePosition
    local posX = x - absPos.X
    local posY = y - absPos.Y
    
    ripple.Position = UDim2.new(0, posX, 0, posY)
    ripple.Size = UDim2.new(0, 0, 0, 0)
    
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(1, 0)
    corner.Parent = ripple
    
    ripple.Parent = button
    
    local maxSize = math.max(button.AbsoluteSize.X, button.AbsoluteSize.Y) * 2.5
    
    Tween(ripple, {Size = UDim2.new(0, maxSize, 0, maxSize), BackgroundTransparency = 1}, 0.6)
    
    task.delay(0.6, function()
        ripple:Destroy()
    end)
end

local function CreateButton(parent, text, size, position, color, callback)
    local btn = Instance.new("TextButton")
    btn.Name = text .. "Button"
    btn.Size = size
    btn.Position = position
    btn.BackgroundColor3 = color or Theme.ButtonBG
    btn.Text = ""
    btn.AutoButtonColor = false
    btn.BorderSizePixel = 0
    btn.ClipsDescendants = true
    btn.Parent = parent
    
    CreateCorner(btn, 6)
    
    local label = Instance.new("TextLabel")
    label.Name = "Label"
    label.Size = UDim2.new(1, 0, 1, 0)
    label.BackgroundTransparency = 1
    label.Text = text
    label.TextColor3 = Theme.Text
    label.Font = Enum.Font.GothamBold
    label.TextSize = isMobile and 13 or 14
    label.ZIndex = btn.ZIndex + 1
    label.Parent = btn
    
    btn.MouseEnter:Connect(function()
        Tween(btn, {BackgroundColor3 = (color and Color3.fromRGB(
            math.min(color.R * 255 + 20, 255),
            math.min(color.G * 255 + 20, 255),
            math.min(color.B * 255 + 20, 255)
        )) or Theme.ButtonHover}, 0.2)
    end)
    
    btn.MouseLeave:Connect(function()
        Tween(btn, {BackgroundColor3 = color or Theme.ButtonBG}, 0.2)
    end)
    
    btn.MouseButton1Click:Connect(function()
        local mouse = UserInputService:GetMouseLocation()
        RippleEffect(btn, mouse.X, mouse.Y)
        if callback then callback() end
    end)
    
    return btn
end

-- ═══════════════════════════════════════════
-- MAIN SCREEN GUI
-- ═══════════════════════════════════════════
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "LinuxExecutor"
ScreenGui.ResetOnSpawn = false
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
ScreenGui.DisplayOrder = 100
ScreenGui.IgnoreGuiInset = true
ScreenGui.Parent = PlayerGui

-- ═══════════════════════════════════════════
-- MAIN FRAME
-- ═══════════════════════════════════════════
local mainWidth = isMobile and 370 or 680
local mainHeight = isMobile and 420 or 480

local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, mainWidth, 0, mainHeight)
MainFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
MainFrame.AnchorPoint = Vector2.new(0.5, 0.5)
MainFrame.BackgroundColor3 = Theme.Background
MainFrame.BorderSizePixel = 0
MainFrame.ClipsDescendants = true
MainFrame.Parent = ScreenGui

CreateCorner(MainFrame, 12)
CreateStroke(MainFrame, Theme.Border, 1)
CreateShadow(MainFrame)

-- ═══════════════════════════════════════════
-- OPEN ANIMATION
-- ═══════════════════════════════════════════
MainFrame.Size = UDim2.new(0, 0, 0, 0)
MainFrame.BackgroundTransparency = 1
MainFrame.Rotation = -5

Tween(MainFrame, {
    Size = UDim2.new(0, mainWidth, 0, mainHeight),
    BackgroundTransparency = 0,
    Rotation = 0
}, 0.5, Enum.EasingStyle.Back)

-- ═══════════════════════════════════════════
-- TOP BAR
-- ═══════════════════════════════════════════
local TopBar = Instance.new("Frame")
TopBar.Name = "TopBar"
TopBar.Size = UDim2.new(1, 0, 0, 36)
TopBar.BackgroundColor3 = Theme.TopBar
TopBar.BorderSizePixel = 0
TopBar.Parent = MainFrame

CreateCorner(TopBar, 12)

-- Bottom cover for TopBar corners
local TopBarCover = Instance.new("Frame")
TopBarCover.Size = UDim2.new(1, 0, 0, 14)
TopBarCover.Position = UDim2.new(0, 0, 1, -14)
TopBarCover.BackgroundColor3 = Theme.TopBar
TopBarCover.BorderSizePixel = 0
TopBarCover.Parent = TopBar

-- Title with Glow
local TitleLabel = Instance.new("TextLabel")
TitleLabel.Name = "Title"
TitleLabel.Size = UDim2.new(0, 200, 1, 0)
TitleLabel.Position = UDim2.new(0, 14, 0, 0)
TitleLabel.BackgroundTransparency = 1
TitleLabel.Text = "🐧 Linux"
TitleLabel.TextColor3 = Theme.Accent
TitleLabel.Font = Enum.Font.GothamBold
TitleLabel.TextSize = 16
TitleLabel.TextXAlignment = Enum.TextXAlignment.Left
TitleLabel.Parent = TopBar

local VersionLabel = Instance.new("TextLabel")
VersionLabel.Size = UDim2.new(0, 60, 1, 0)
VersionLabel.Position = UDim2.new(0, isMobile and 95 or 105, 0, 0)
VersionLabel.BackgroundTransparency = 1
VersionLabel.Text = "v2.0"
VersionLabel.TextColor3 = Theme.TextDim
VersionLabel.Font = Enum.Font.Gotham
VersionLabel.TextSize = 11
VersionLabel.TextXAlignment = Enum.TextXAlignment.Left
VersionLabel.Parent = TopBar

-- Title glow animation
spawn(function()
    while MainFrame and MainFrame.Parent do
        Tween(TitleLabel, {TextColor3 = Theme.AccentHover}, 1.5)
        task.wait(1.5)
        Tween(TitleLabel, {TextColor3 = Theme.Accent}, 1.5)
        task.wait(1.5)
    end
end)

-- ═══════════════════════════════════════════
-- WINDOW CONTROLS (Close, Minimize, Maximize)
-- ═══════════════════════════════════════════
local function CreateWindowBtn(name, color, posOffset, callback)
    local btn = Instance.new("TextButton")
    btn.Name = name
    btn.Size = UDim2.new(0, 20, 0, 20)
    btn.Position = UDim2.new(1, posOffset, 0.5, -10)
    btn.BackgroundColor3 = color
    btn.Text = ""
    btn.AutoButtonColor = false
    btn.BorderSizePixel = 0
    btn.Parent = TopBar
    
    CreateCorner(btn, 10)
    
    btn.MouseEnter:Connect(function()
        Tween(btn, {Size = UDim2.new(0, 24, 0, 24), Position = UDim2.new(1, posOffset - 2, 0.5, -12)}, 0.15)
    end)
    
    btn.MouseLeave:Connect(function()
        Tween(btn, {Size = UDim2.new(0, 20, 0, 20), Position = UDim2.new(1, posOffset, 0.5, -10)}, 0.15)
    end)
    
    btn.MouseButton1Click:Connect(callback)
    
    return btn
end

local isMinimized = false
local savedSize

-- Close Button
CreateWindowBtn("Close", Theme.Close, -34, function()
    Tween(MainFrame, {
        Size = UDim2.new(0, 0, 0, 0),
        BackgroundTransparency = 1,
        Rotation = 5
    }, 0.4, Enum.EasingStyle.Back, Enum.EasingDirection.In)
    task.wait(0.4)
    ScreenGui:Destroy()
end)

-- Minimize Button
CreateWindowBtn("Minimize", Theme.Minimize, -60, function()
    if isMinimized then
        Tween(MainFrame, {Size = savedSize}, 0.3, Enum.EasingStyle.Back)
        isMinimized = false
    else
        savedSize = MainFrame.Size
        Tween(MainFrame, {Size = UDim2.new(0, mainWidth, 0, 36)}, 0.3, Enum.EasingStyle.Quint)
        isMinimized = true
    end
end)

-- Maximize / Restore
local isMaximized = false
CreateWindowBtn("Maximize", Theme.Maximize, -86, function()
    if isMaximized then
        Tween(MainFrame, {Size = UDim2.new(0, mainWidth, 0, mainHeight)}, 0.3, Enum.EasingStyle.Back)
        isMaximized = false
    else
        Tween(MainFrame, {Size = UDim2.new(1, -20, 1, -20)}, 0.3, Enum.EasingStyle.Back)
        isMaximized = true
    end
end)

-- ═══════════════════════════════════════════
-- DRAGGING
-- ═══════════════════════════════════════════
local dragging, dragInput, dragStart, startPos

TopBar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPos = MainFrame.Position
        
        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

TopBar.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
        dragInput = input
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input == dragInput and dragging then
        local delta = input.Position - dragStart
        MainFrame.Position = UDim2.new(
            startPos.X.Scale, startPos.X.Offset + delta.X,
            startPos.Y.Scale, startPos.Y.Offset + delta.Y
        )
    end
end)

-- ═══════════════════════════════════════════
-- TAB SYSTEM
-- ═══════════════════════════════════════════
local TabBar = Instance.new("Frame")
TabBar.Name = "TabBar"
TabBar.Size = UDim2.new(1, 0, 0, 34)
TabBar.Position = UDim2.new(0, 0, 0, 36)
TabBar.BackgroundColor3 = Theme.Sidebar
TabBar.BorderSizePixel = 0
TabBar.Parent = MainFrame

local TabBarLayout = Instance.new("UIListLayout")
TabBarLayout.FillDirection = Enum.FillDirection.Horizontal
TabBarLayout.Padding = UDim.new(0, 2)
TabBarLayout.SortOrder = Enum.SortOrder.LayoutOrder
TabBarLayout.Parent = TabBar

local TabBarPadding = Instance.new("UIPadding")
TabBarPadding.PaddingLeft = UDim.new(0, 8)
TabBarPadding.PaddingTop = UDim.new(0, 4)
TabBarPadding.Parent = TabBar

-- Tab Pages Container
local TabPages = Instance.new("Frame")
TabPages.Name = "TabPages"
TabPages.Size = UDim2.new(1, 0, 1, -70)
TabPages.Position = UDim2.new(0, 0, 0, 70)
TabPages.BackgroundTransparency = 1
TabPages.BorderSizePixel = 0
TabPages.ClipsDescendants = true
TabPages.Parent = MainFrame

local tabs = {}
local currentTab = nil

local function CreateTab(name, icon, layoutOrder)
    local tabBtn = Instance.new("TextButton")
    tabBtn.Name = name .. "Tab"
    tabBtn.Size = UDim2.new(0, isMobile and 62 or 80, 0, 26)
    tabBtn.BackgroundColor3 = Theme.TabInactive
    tabBtn.Text = ""
    tabBtn.AutoButtonColor = false
    tabBtn.BorderSizePixel = 0
    tabBtn.LayoutOrder = layoutOrder
    tabBtn.ClipsDescendants = true
    tabBtn.Parent = TabBar
    
    CreateCorner(tabBtn, 6)
    
    local tabLabel = Instance.new("TextLabel")
    tabLabel.Size = UDim2.new(1, 0, 1, 0)
    tabLabel.BackgroundTransparency = 1
    tabLabel.Text = (icon and (icon .. " ") or "") .. name
    tabLabel.TextColor3 = Theme.TextDim
    tabLabel.Font = Enum.Font.GothamBold
    tabLabel.TextSize = isMobile and 11 or 12
    tabLabel.Parent = tabBtn
    
    -- Indicator line
    local indicator = Instance.new("Frame")
    indicator.Name = "Indicator"
    indicator.Size = UDim2.new(0, 0, 0, 2)
    indicator.Position = UDim2.new(0.5, 0, 1, -2)
    indicator.AnchorPoint = Vector2.new(0.5, 0)
    indicator.BackgroundColor3 = Theme.Accent
    indicator.BorderSizePixel = 0
    indicator.Parent = tabBtn
    CreateCorner(indicator, 1)
    
    local page = Instance.new("Frame")
    page.Name = name .. "Page"
    page.Size = UDim2.new(1, 0, 1, 0)
    page.BackgroundTransparency = 1
    page.BorderSizePixel = 0
    page.Visible = false
    page.Parent = TabPages
    
    tabs[name] = {Button = tabBtn, Label = tabLabel, Page = page, Indicator = indicator}
    
    tabBtn.MouseButton1Click:Connect(function()
        local mouse = UserInputService:GetMouseLocation()
        RippleEffect(tabBtn, mouse.X, mouse.Y)
        
        -- Switch tabs
        for tName, tData in pairs(tabs) do
            if tName == name then
                Tween(tData.Button, {BackgroundColor3 = Theme.TabActive}, 0.2)
                Tween(tData.Label, {TextColor3 = Color3.fromRGB(255, 255, 255)}, 0.2)
                Tween(tData.Indicator, {Size = UDim2.new(0.6, 0, 0, 2)}, 0.3, Enum.EasingStyle.Back)
                tData.Page.Visible = true
                -- Fade in
                for _, child in pairs(tData.Page:GetChildren()) do
                    if child:IsA("GuiObject") then
                        child.BackgroundTransparency = 1
                        Tween(child, {BackgroundTransparency = child:GetAttribute("OrigTransparency") or 0}, 0.3)
                    end
                end
            else
                Tween(tData.Button, {BackgroundColor3 = Theme.TabInactive}, 0.2)
                Tween(tData.Label, {TextColor3 = Theme.TextDim}, 0.2)
                Tween(tData.Indicator, {Size = UDim2.new(0, 0, 0, 2)}, 0.2)
                tData.Page.Visible = false
            end
        end
        currentTab = name
    end)
    
    return page
end

-- Create Tabs
local editorPage = CreateTab("Editor", "📝", 1)
local consolePage = CreateTab("Console", "💻", 2)
local settingsPage = CreateTab("Settings", "⚙", 3)
local infoPage = CreateTab("Info", "ℹ", 4)
local morePage = CreateTab("More", "📦", 5)

-- ═══════════════════════════════════════════
-- EDITOR PAGE
-- ═══════════════════════════════════════════

-- Editor Container
local EditorContainer = Instance.new("Frame")
EditorContainer.Name = "EditorContainer"
EditorContainer.Size = UDim2.new(1, -16, 1, -56)
EditorContainer.Position = UDim2.new(0, 8, 0, 4)
EditorContainer.BackgroundColor3 = Theme.Editor
EditorContainer.BorderSizePixel = 0
EditorContainer.ClipsDescendants = true
EditorContainer.Parent = editorPage

CreateCorner(EditorContainer, 8)
CreateStroke(EditorContainer, Theme.Border, 1)

-- Line Numbers
local LineNumberFrame = Instance.new("Frame")
LineNumberFrame.Name = "LineNumbers"
LineNumberFrame.Size = UDim2.new(0, 45, 1, 0)
LineNumberFrame.BackgroundColor3 = Theme.EditorLineBar
LineNumberFrame.BorderSizePixel = 0
LineNumberFrame.ClipsDescendants = true
LineNumberFrame.Parent = EditorContainer

CreateCorner(LineNumberFrame, 8)

local LineNumCover = Instance.new("Frame")
LineNumCover.Size = UDim2.new(0, 10, 1, 0)
LineNumCover.Position = UDim2.new(1, -10, 0, 0)
LineNumCover.BackgroundColor3 = Theme.EditorLineBar
LineNumCover.BorderSizePixel = 0
LineNumCover.Parent = LineNumberFrame

local LineNumberLabel = Instance.new("TextLabel")
LineNumberLabel.Name = "Lines"
LineNumberLabel.Size = UDim2.new(1, -8, 1, 0)
LineNumberLabel.Position = UDim2.new(0, 4, 0, 0)
LineNumberLabel.BackgroundTransparency = 1
LineNumberLabel.Text = "1"
LineNumberLabel.TextColor3 = Theme.TextLineNum
LineNumberLabel.Font = Enum.Font.Code
LineNumberLabel.TextSize = isMobile and 12 or 14
LineNumberLabel.TextXAlignment = Enum.TextXAlignment.Right
LineNumberLabel.TextYAlignment = Enum.TextYAlignment.Top
LineNumberLabel.RichText = true
LineNumberLabel.Parent = LineNumberFrame

-- Script Editor (Scrolling)
local EditorScroll = Instance.new("ScrollingFrame")
EditorScroll.Name = "EditorScroll"
EditorScroll.Size = UDim2.new(1, -50, 1, 0)
EditorScroll.Position = UDim2.new(0, 48, 0, 0)
EditorScroll.BackgroundTransparency = 1
EditorScroll.BorderSizePixel = 0
EditorScroll.ScrollBarThickness = 4
EditorScroll.ScrollBarImageColor3 = Theme.ScrollBar
EditorScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
EditorScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
EditorScroll.Parent = EditorContainer

local ScriptInput = Instance.new("TextBox")
ScriptInput.Name = "ScriptInput"
ScriptInput.Size = UDim2.new(1, -10, 0, 5000)
ScriptInput.Position = UDim2.new(0, 5, 0, 0)
ScriptInput.BackgroundTransparency = 1
ScriptInput.Text = ""
ScriptInput.PlaceholderText = "-- Paste your script here...\n-- Linux Executor v2.0\n\nprint('Hello from Linux!')"
ScriptInput.PlaceholderColor3 = Theme.TextDim
ScriptInput.TextColor3 = Theme.Text
ScriptInput.Font = Enum.Font.Code
ScriptInput.TextSize = isMobile and 12 or 14
ScriptInput.TextXAlignment = Enum.TextXAlignment.Left
ScriptInput.TextYAlignment = Enum.TextYAlignment.Top
ScriptInput.ClearTextOnFocus = false
ScriptInput.MultiLine = true
ScriptInput.TextWrapped = false
ScriptInput.Parent = EditorScroll

-- Line Number Updater
local function UpdateLineNumbers()
    local text = ScriptInput.Text
    local lineCount = 1
    for _ in text:gmatch("\n") do
        lineCount = lineCount + 1
    end
    
    local lines = {}
    for i = 1, math.max(lineCount, 20) do
        if i <= lineCount then
            lines[i] = '<font color="rgb(80,80,110)">' .. tostring(i) .. '</font>'
        else
            lines[i] = '<font color="rgb(50,50,65)">' .. tostring(i) .. '</font>'
        end
    end
    LineNumberLabel.Text = table.concat(lines, "\n")
end

ScriptInput:GetPropertyChangedSignal("Text"):Connect(UpdateLineNumbers)

-- Sync scroll between line numbers and editor
EditorScroll:GetPropertyChangedSignal("CanvasPosition"):Connect(function()
    LineNumberLabel.Position = UDim2.new(0, 4, 0, -EditorScroll.CanvasPosition.Y)
end)

UpdateLineNumbers()

-- Character / Line Counter
local CounterLabel = Instance.new("TextLabel")
CounterLabel.Name = "Counter"
CounterLabel.Size = UDim2.new(1, -16, 0, 18)
CounterLabel.Position = UDim2.new(0, 8, 1, -22)
CounterLabel.BackgroundTransparency = 1
CounterLabel.Text = "Lines: 0 | Chars: 0"
CounterLabel.TextColor3 = Theme.TextDim
CounterLabel.Font = Enum.Font.Code
CounterLabel.TextSize = 11
CounterLabel.TextXAlignment = Enum.TextXAlignment.Right
CounterLabel.Parent = EditorContainer

ScriptInput:GetPropertyChangedSignal("Text"):Connect(function()
    local text = ScriptInput.Text
    local lineCount = 1
    for _ in text:gmatch("\n") do
        lineCount = lineCount + 1
    end
    CounterLabel.Text = "Lines: " .. lineCount .. " | Chars: " .. #text
end)

-- ═══════════════════════════════════════════
-- BOTTOM ACTION BAR (Editor)
-- ═══════════════════════════════════════════
local ActionBar = Instance.new("Frame")
ActionBar.Name = "ActionBar"
ActionBar.Size = UDim2.new(1, -16, 0, 40)
ActionBar.Position = UDim2.new(0, 8, 1, -46)
ActionBar.BackgroundTransparency = 1
ActionBar.BorderSizePixel = 0
ActionBar.Parent = editorPage

local ActionLayout = Instance.new("UIListLayout")
ActionLayout.FillDirection = Enum.FillDirection.Horizontal
ActionLayout.Padding = UDim.new(0, 6)
ActionLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
ActionLayout.Parent = ActionBar

-- Console log storage
local consoleHistory = {}

local function AddConsoleMessage(msg, msgType)
    local color = Theme.ConsoleText
    local prefix = "[LOG]"
    if msgType == "error" then
        color = Theme.Error
        prefix = "[ERR]"
    elseif msgType == "warn" then
        color = Theme.Warning
        prefix = "[WRN]"
    elseif msgType == "info" then
        color = Color3.fromRGB(100, 180, 255)
        prefix = "[INF]"
    elseif msgType == "system" then
        color = Theme.Accent
        prefix = "[SYS]"
    end
    
    table.insert(consoleHistory, {
        Text = prefix .. " " .. os.date("%H:%M:%S") .. " > " .. msg,
        Color = color,
        Time = tick()
    })
end

-- Forward-declare console update (will be set later)
local UpdateConsoleDisplay

-- Execute Button
local btnWidth = isMobile and 75 or 100

CreateButton(ActionBar, "▶ Execute", UDim2.new(0, btnWidth, 0, 34), UDim2.new(0, 0, 0, 0), Theme.Accent, function()
    local code = ScriptInput.Text
    if code == "" or code == nil then
        AddConsoleMessage("No script to execute!", "error")
        if UpdateConsoleDisplay then UpdateConsoleDisplay() end
        return
    end
    
    AddConsoleMessage("Executing script (" .. #code .. " chars)...", "system")
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
    
    local success, err = pcall(function()
        local fn, loadErr = loadstring(code)
        if fn then
            fn()
        else
            error(loadErr)
        end
    end)
    
    if success then
        AddConsoleMessage("Script executed successfully!", "system")
    else
        AddConsoleMessage("Error: " .. tostring(err), "error")
    end
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

-- Clear Button
CreateButton(ActionBar, "🗑 Clear", UDim2.new(0, btnWidth, 0, 34), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    ScriptInput.Text = ""
    UpdateLineNumbers()
    AddConsoleMessage("Editor cleared", "info")
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

-- Copy Button
CreateButton(ActionBar, "📋 Copy", UDim2.new(0, btnWidth, 0, 34), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    if setclipboard then
        setclipboard(ScriptInput.Text)
        AddConsoleMessage("Script copied to clipboard!", "info")
    else
        AddConsoleMessage("Clipboard not supported", "warn")
    end
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

-- Paste Button (good for mobile)
CreateButton(ActionBar, "📌 Paste", UDim2.new(0, btnWidth, 0, 34), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    -- Focus the textbox for paste
    ScriptInput:CaptureFocus()
    AddConsoleMessage("Textbox focused - paste your script!", "info")
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

-- ═══════════════════════════════════════════
-- CONSOLE PAGE
-- ═══════════════════════════════════════════
local ConsoleContainer = Instance.new("Frame")
ConsoleContainer.Name = "ConsoleContainer"
ConsoleContainer.Size = UDim2.new(1, -16, 1, -50)
ConsoleContainer.Position = UDim2.new(0, 8, 0, 4)
ConsoleContainer.BackgroundColor3 = Theme.Console
ConsoleContainer.BorderSizePixel = 0
ConsoleContainer.ClipsDescendants = true
ConsoleContainer.Parent = consolePage

CreateCorner(ConsoleContainer, 8)
CreateStroke(ConsoleContainer, Theme.Border, 1)

-- Console header
local ConsoleHeader = Instance.new("Frame")
ConsoleHeader.Size = UDim2.new(1, 0, 0, 28)
ConsoleHeader.BackgroundColor3 = Color3.fromRGB(15, 15, 22)
ConsoleHeader.BorderSizePixel = 0
ConsoleHeader.Parent = ConsoleContainer
CreateCorner(ConsoleHeader, 8)

local ConsoleHeaderCover = Instance.new("Frame")
ConsoleHeaderCover.Size = UDim2.new(1, 0, 0, 10)
ConsoleHeaderCover.Position = UDim2.new(0, 0, 1, -10)
ConsoleHeaderCover.BackgroundColor3 = Color3.fromRGB(15, 15, 22)
ConsoleHeaderCover.BorderSizePixel = 0
ConsoleHeaderCover.Parent = ConsoleHeader

local ConsoleHeaderLabel = Instance.new("TextLabel")
ConsoleHeaderLabel.Size = UDim2.new(1, -10, 1, 0)
ConsoleHeaderLabel.Position = UDim2.new(0, 10, 0, 0)
ConsoleHeaderLabel.BackgroundTransparency = 1
ConsoleHeaderLabel.Text = "📟 Console Output"
ConsoleHeaderLabel.TextColor3 = Theme.Accent
ConsoleHeaderLabel.Font = Enum.Font.GothamBold
ConsoleHeaderLabel.TextSize = 12
ConsoleHeaderLabel.TextXAlignment = Enum.TextXAlignment.Left
ConsoleHeaderLabel.Parent = ConsoleHeader

local ConsoleScroll = Instance.new("ScrollingFrame")
ConsoleScroll.Name = "ConsoleScroll"
ConsoleScroll.Size = UDim2.new(1, -10, 1, -34)
ConsoleScroll.Position = UDim2.new(0, 5, 0, 30)
ConsoleScroll.BackgroundTransparency = 1
ConsoleScroll.BorderSizePixel = 0
ConsoleScroll.ScrollBarThickness = 3
ConsoleScroll.ScrollBarImageColor3 = Theme.ScrollBar
ConsoleScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
ConsoleScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
ConsoleScroll.Parent = ConsoleContainer

local ConsoleLayout = Instance.new("UIListLayout")
ConsoleLayout.Padding = UDim.new(0, 2)
ConsoleLayout.SortOrder = Enum.SortOrder.LayoutOrder
ConsoleLayout.Parent = ConsoleScroll

-- Now define the console update function
UpdateConsoleDisplay = function()
    for _, child in pairs(ConsoleScroll:GetChildren()) do
        if child:IsA("TextLabel") then
            child:Destroy()
        end
    end
    
    for i, entry in ipairs(consoleHistory) do
        local line = Instance.new("TextLabel")
        line.Name = "Line_" .. i
        line.Size = UDim2.new(1, -10, 0, 18)
        line.BackgroundTransparency = 1
        line.Text = entry.Text
        line.TextColor3 = entry.Color
        line.Font = Enum.Font.Code
        line.TextSize = isMobile and 10 or 12
        line.TextXAlignment = Enum.TextXAlignment.Left
        line.TextWrapped = true
        line.AutomaticSize = Enum.AutomaticSize.Y
        line.LayoutOrder = i
        line.Parent = ConsoleScroll
        
        -- Animate in
        line.TextTransparency = 1
        Tween(line, {TextTransparency = 0}, 0.3)
    end
    
    -- Auto scroll to bottom
    task.wait()
    ConsoleScroll.CanvasPosition = Vector2.new(0, ConsoleScroll.AbsoluteCanvasSize.Y)
end

-- Console Action Buttons
local ConsoleActions = Instance.new("Frame")
ConsoleActions.Name = "ConsoleActions"
ConsoleActions.Size = UDim2.new(1, -16, 0, 36)
ConsoleActions.Position = UDim2.new(0, 8, 1, -42)
ConsoleActions.BackgroundTransparency = 1
ConsoleActions.Parent = consolePage

local ConsoleActLayout = Instance.new("UIListLayout")
ConsoleActLayout.FillDirection = Enum.FillDirection.Horizontal
ConsoleActLayout.Padding = UDim.new(0, 6)
ConsoleActLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
ConsoleActLayout.Parent = ConsoleActions

CreateButton(ConsoleActions, "🗑 Clear Console", UDim2.new(0, 130, 0, 30), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    consoleHistory = {}
    UpdateConsoleDisplay()
end)

CreateButton(ConsoleActions, "📋 Copy Log", UDim2.new(0, 110, 0, 30), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    local fullLog = ""
    for _, entry in ipairs(consoleHistory) do
        fullLog = fullLog .. entry.Text .. "\n"
    end
    if setclipboard then
        setclipboard(fullLog)
        AddConsoleMessage("Console log copied!", "info")
    end
    UpdateConsoleDisplay()
end)

-- Hook into game output
local logConnection = game:GetService("LogService").MessageOut:Connect(function(message, messageType)
    if messageType == Enum.MessageType.MessageError then
        AddConsoleMessage(message, "error")
    elseif messageType == Enum.MessageType.MessageWarning then
        AddConsoleMessage(message, "warn")
    elseif messageType == Enum.MessageType.MessageInfo then
        AddConsoleMessage(message, "info")
    else
        AddConsoleMessage(message, "log")
    end
    UpdateConsoleDisplay()
end)

-- Initial console message
AddConsoleMessage("Linux Executor v2.0 initialized", "system")
AddConsoleMessage("Platform: " .. (isMobile and "Mobile" or "Desktop"), "info")
AddConsoleMessage("Player: " .. Player.Name, "info")
AddConsoleMessage("Ready to execute scripts!", "system")

-- ═══════════════════════════════════════════
-- SETTINGS PAGE
-- ═══════════════════════════════════════════
local SettingsScroll = Instance.new("ScrollingFrame")
SettingsScroll.Name = "SettingsScroll"
SettingsScroll.Size = UDim2.new(1, -16, 1, -10)
SettingsScroll.Position = UDim2.new(0, 8, 0, 5)
SettingsScroll.BackgroundTransparency = 1
SettingsScroll.BorderSizePixel = 0
SettingsScroll.ScrollBarThickness = 3
SettingsScroll.ScrollBarImageColor3 = Theme.ScrollBar
SettingsScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
SettingsScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
SettingsScroll.Parent = settingsPage

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

local function CreateSettingToggle(name, description, default, callback)
    local container = Instance.new("Frame")
    container.Name = name
    container.Size = UDim2.new(1, -10, 0, 55)
    container.BackgroundColor3 = Theme.Editor
    container.BorderSizePixel = 0
    container.Parent = SettingsScroll
    
    CreateCorner(container, 8)
    
    local nameLabel = Instance.new("TextLabel")
    nameLabel.Size = UDim2.new(1, -70, 0, 22)
    nameLabel.Position = UDim2.new(0, 12, 0, 6)
    nameLabel.BackgroundTransparency = 1
    nameLabel.Text = name
    nameLabel.TextColor3 = Theme.Text
    nameLabel.Font = Enum.Font.GothamBold
    nameLabel.TextSize = 13
    nameLabel.TextXAlignment = Enum.TextXAlignment.Left
    nameLabel.Parent = container
    
    local descLabel = Instance.new("TextLabel")
    descLabel.Size = UDim2.new(1, -70, 0, 18)
    descLabel.Position = UDim2.new(0, 12, 0, 28)
    descLabel.BackgroundTransparency = 1
    descLabel.Text = description
    descLabel.TextColor3 = Theme.TextDim
    descLabel.Font = Enum.Font.Gotham
    descLabel.TextSize = 11
    descLabel.TextXAlignment = Enum.TextXAlignment.Left
    descLabel.Parent = container
    
    -- Toggle
    local toggleBG = Instance.new("TextButton")
    toggleBG.Size = UDim2.new(0, 44, 0, 24)
    toggleBG.Position = UDim2.new(1, -56, 0.5, -12)
    toggleBG.BackgroundColor3 = default and Theme.Accent or Color3.fromRGB(60, 60, 75)
    toggleBG.Text = ""
    toggleBG.AutoButtonColor = false
    toggleBG.BorderSizePixel = 0
    toggleBG.Parent = container
    CreateCorner(toggleBG, 12)
    
    local toggleCircle = Instance.new("Frame")
    toggleCircle.Size = UDim2.new(0, 18, 0, 18)
    toggleCircle.Position = default and UDim2.new(1, -21, 0.5, -9) or UDim2.new(0, 3, 0.5, -9)
    toggleCircle.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    toggleCircle.BorderSizePixel = 0
    toggleCircle.Parent = toggleBG
    CreateCorner(toggleCircle, 9)
    
    local enabled = default
    
    toggleBG.MouseButton1Click:Connect(function()
        enabled = not enabled
        Tween(toggleBG, {BackgroundColor3 = enabled and Theme.Accent or Color3.fromRGB(60, 60, 75)}, 0.3)
        Tween(toggleCircle, {Position = enabled and UDim2.new(1, -21, 0.5, -9) or UDim2.new(0, 3, 0.5, -9)}, 0.3, Enum.EasingStyle.Back)
        if callback then callback(enabled) end
    end)
    
    return container
end

local function CreateSettingSection(title, order)
    local section = Instance.new("TextLabel")
    section.Name = "Section_" .. title
    section.Size = UDim2.new(1, 0, 0, 28)
    section.BackgroundTransparency = 1
    section.Text = "  " .. title
    section.TextColor3 = Theme.Accent
    section.Font = Enum.Font.GothamBold
    section.TextSize = 14
    section.TextXAlignment = Enum.TextXAlignment.Left
    section.LayoutOrder = order
    section.Parent = SettingsScroll
    return section
end

CreateSettingSection("🎨 Appearance", 1)

local autoScroll = true
CreateSettingToggle("Auto-Scroll Console", "Automatically scroll to latest message", true, function(val)
    autoScroll = val
end)

local showLineNums = true
CreateSettingToggle("Show Line Numbers", "Display line numbers in editor", true, function(val)
    showLineNums = val
    LineNumberFrame.Visible = val
    if val then
        EditorScroll.Size = UDim2.new(1, -50, 1, 0)
        EditorScroll.Position = UDim2.new(0, 48, 0, 0)
    else
        EditorScroll.Size = UDim2.new(1, -10, 1, 0)
        EditorScroll.Position = UDim2.new(0, 5, 0, 0)
    end
end)

CreateSettingToggle("Text Wrapping", "Wrap long lines in editor", false, function(val)
    ScriptInput.TextWrapped = val
end)

CreateSettingSection("⚡ Performance", 10)

CreateSettingToggle("Animations", "Enable UI animations", true, function(val)
    -- This would toggle animations globally in a real implementation
    AddConsoleMessage("Animations " .. (val and "enabled" or "disabled"), "info")
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

CreateSettingToggle("Auto-Execute on Paste", "Run script automatically when pasted", false, function(val)
    if val then
        AddConsoleMessage("Auto-execute enabled (be careful!)", "warn")
    else
        AddConsoleMessage("Auto-execute disabled", "info")
    end
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

CreateSettingSection("🔒 Security", 20)

CreateSettingToggle("Confirm Before Execute", "Show confirmation before running scripts", false, function(val)
    AddConsoleMessage("Confirmation " .. (val and "enabled" or "disabled"), "info")
    if UpdateConsoleDisplay then UpdateConsoleDisplay() end
end)

-- ═══════════════════════════════════════════
-- INFO PAGE
-- ═══════════════════════════════════════════
local InfoScroll = Instance.new("ScrollingFrame")
InfoScroll.Name = "InfoScroll"
InfoScroll.Size = UDim2.new(1, -16, 1, -10)
InfoScroll.Position = UDim2.new(0, 8, 0, 5)
InfoScroll.BackgroundTransparency = 1
InfoScroll.BorderSizePixel = 0
InfoScroll.ScrollBarThickness = 3
InfoScroll.ScrollBarImageColor3 = Theme.ScrollBar
InfoScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
InfoScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
InfoScroll.Parent = infoPage

local InfoLayout = Instance.new("UIListLayout")
InfoLayout.Padding = UDim.new(0, 8)
InfoLayout.SortOrder = Enum.SortOrder.LayoutOrder
InfoLayout.Parent = InfoScroll

local function CreateInfoCard(title, content, icon, order)
    local card = Instance.new("Frame")
    card.Name = title
    card.Size = UDim2.new(1, -10, 0, 0)
    card.AutomaticSize = Enum.AutomaticSize.Y
    card.BackgroundColor3 = Theme.Editor
    card.BorderSizePixel = 0
    card.LayoutOrder = order or 0
    card.Parent = InfoScroll
    
    CreateCorner(card, 8)
    CreateStroke(card, Theme.Border, 1)
    
    local padding = Instance.new("UIPadding")
    padding.PaddingLeft = UDim.new(0, 14)
    padding.PaddingRight = UDim.new(0, 14)
    padding.PaddingTop = UDim.new(0, 10)
    padding.PaddingBottom = UDim.new(0, 10)
    padding.Parent = card
    
    local titleL = Instance.new("TextLabel")
    titleL.Size = UDim2.new(1, 0, 0, 22)
    titleL.BackgroundTransparency = 1
    titleL.Text = (icon or "") .. " " .. title
    titleL.TextColor3 = Theme.Accent
    titleL.Font = Enum.Font.GothamBold
    titleL.TextSize = 15
    titleL.TextXAlignment = Enum.TextXAlignment.Left
    titleL.Parent = card
    
    local contentL = Instance.new("TextLabel")
    contentL.Size = UDim2.new(1, 0, 0, 0)
    contentL.Position = UDim2.new(0, 0, 0, 26)
    contentL.AutomaticSize = Enum.AutomaticSize.Y
    contentL.BackgroundTransparency = 1
    contentL.Text = content
    contentL.TextColor3 = Theme.TextDim
    contentL.Font = Enum.Font.Gotham
    contentL.TextSize = 12
    contentL.TextXAlignment = Enum.TextXAlignment.Left
    contentL.TextWrapped = true
    contentL.Parent = card
    
    return card
end

CreateInfoCard("Linux Executor", 
    "A powerful, lightweight script executor with a modern UI design inspired by Linux terminals.\n\nVersion: 2.0\nBuild: " .. os.date("%Y.%m.%d"),
    "🐧", 1)

CreateInfoCard("Features",
    "• Full script editor with line numbers\n• Real-time character & line counter\n• Console output with color-coded messages\n• Log service integration\n• Mobile-optimized touch controls\n• Draggable & resizable window\n• Smooth animations & transitions\n• Settings panel with toggles\n• Clipboard support\n• Multi-tab interface",
    "✨", 2)

CreateInfoCard("System Info",
    "Player: " .. Player.Name ..
    "\nDisplay Name: " .. Player.DisplayName ..
    "\nUser ID: " .. Player.UserId ..
    "\nPlatform: " .. (isMobile and "📱 Mobile" or "💻 Desktop") ..
    "\nGame: " .. game:GetService("MarketplaceService"):GetProductInfo(game.PlaceId).Name ..
    "\nPlace ID: " .. game.PlaceId ..
    "\nServer Job ID: " .. string.sub(game.JobId, 1, 16) .. "...",
    "🖥", 3)

CreateInfoCard("Controls",
    "• Drag the title bar to move\n• Click ⚫ to close, 🟡 to minimize, 🟢 to maximize\n• Use tabs to switch between pages\n• Paste scripts in the Editor tab\n• Click Execute (▶) to run your script\n• Check Console for output & errors",
    "🎮", 4)

CreateInfoCard("Credits",
    "Developed with ❤️\nUI Framework: Custom Built\nInspired by Linux terminals & modern IDEs",
    "👤", 5)

-- ═══════════════════════════════════════════
-- MORE PAGE
-- ═══════════════════════════════════════════
local MoreScroll = Instance.new("ScrollingFrame")
MoreScroll.Name = "MoreScroll"
MoreScroll.Size = UDim2.new(1, -16, 1, -10)
MoreScroll.Position = UDim2.new(0, 8, 0, 5)
MoreScroll.BackgroundTransparency = 1
MoreScroll.BorderSizePixel = 0
MoreScroll.ScrollBarThickness = 3
MoreScroll.ScrollBarImageColor3 = Theme.ScrollBar
MoreScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y
MoreScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
MoreScroll.Parent = morePage

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

-- Quick Scripts Section
local function CreateQuickScript(name, description, script, order)
    local card = Instance.new("Frame")
    card.Name = name
    card.Size = UDim2.new(1, -10, 0, 70)
    card.BackgroundColor3 = Theme.Editor
    card.BorderSizePixel = 0
    card.LayoutOrder = order
    card.Parent = MoreScroll
    
    CreateCorner(card, 8)
    CreateStroke(card, Theme.Border, 1)
    
    local nameL = Instance.new("TextLabel")
    nameL.Size = UDim2.new(1, -90, 0, 20)
    nameL.Position = UDim2.new(0, 12, 0, 8)
    nameL.BackgroundTransparency = 1
    nameL.Text = "📜 " .. name
    nameL.TextColor3 = Theme.Text
    nameL.Font = Enum.Font.GothamBold
    nameL.TextSize = 13
    nameL.TextXAlignment = Enum.TextXAlignment.Left
    nameL.Parent = card
    
    local descL = Instance.new("TextLabel")
    descL.Size = UDim2.new(1, -90, 0, 16)
    descL.Position = UDim2.new(0, 12, 0, 28)
    descL.BackgroundTransparency = 1
    descL.Text = description
    descL.TextColor3 = Theme.TextDim
    descL.Font = Enum.Font.Gotham
    descL.TextSize = 11
    descL.TextXAlignment = Enum.TextXAlignment.Left
    descL.Parent = card
    
    local linesCount = 1
    for _ in script:gmatch("\n") do linesCount = linesCount + 1 end
    
    local statsL = Instance.new("TextLabel")
    statsL.Size = UDim2.new(1, -12, 0, 14)
    statsL.Position = UDim2.new(0, 12, 0, 48)
    statsL.BackgroundTransparency = 1
    statsL.Text = "📏 " .. linesCount .. " lines | " .. #script .. " chars"
    statsL.TextColor3 = Color3.fromRGB(70, 70, 100)
    statsL.Font = Enum.Font.Code
    statsL.TextSize = 10
    statsL.TextXAlignment = Enum.TextXAlignment.Left
    statsL.Parent = card
    
    -- Load button
    local loadBtn = Instance.new("TextButton")
    loadBtn.Size = UDim2.new(0, 65, 0, 28)
    loadBtn.Position = UDim2.new(1, -78, 0.5, -14)
    loadBtn.BackgroundColor3 = Theme.Accent
    loadBtn.Text = ""
    loadBtn.AutoButtonColor = false
    loadBtn.BorderSizePixel = 0
    loadBtn.ClipsDescendants = true
    loadBtn.Parent = card
    CreateCorner(loadBtn, 6)
    
    local loadLabel = Instance.new("TextLabel")
    loadLabel.Size = UDim2.new(1, 0, 1, 0)
    loadLabel.BackgroundTransparency = 1
    loadLabel.Text = "Load"
    loadLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    loadLabel.Font = Enum.Font.GothamBold
    loadLabel.TextSize = 12
    loadLabel.Parent = loadBtn
    
    loadBtn.MouseEnter:Connect(function()
        Tween(loadBtn, {BackgroundColor3 = Theme.AccentHover}, 0.2)
    end)
    
    loadBtn.MouseLeave:Connect(function()
        Tween(loadBtn, {BackgroundColor3 = Theme.Accent}, 0.2)
    end)
    
    loadBtn.MouseButton1Click:Connect(function()
        local mouse = UserInputService:GetMouseLocation()
        RippleEffect(loadBtn, mouse.X, mouse.Y)
        ScriptInput.Text = script
        UpdateLineNumbers()
        
        -- Switch to Editor tab
        for tName, tData in pairs(tabs) do
            if tName == "Editor" then
                Tween(tData.Button, {BackgroundColor3 = Theme.TabActive}, 0.2)
                Tween(tData.Label, {TextColor3 = Color3.fromRGB(255, 255, 255)}, 0.2)
                Tween(tData.Indicator, {Size = UDim2.new(0.6, 0, 0, 2)}, 0.3, Enum.EasingStyle.Back)
                tData.Page.Visible = true
            else
                Tween(tData.Button, {BackgroundColor3 = Theme.TabInactive}, 0.2)
                Tween(tData.Label, {TextColor3 = Theme.TextDim}, 0.2)
                Tween(tData.Indicator, {Size = UDim2.new(0, 0, 0, 2)}, 0.2)
                tData.Page.Visible = false
            end
        end
        
        AddConsoleMessage("Loaded script: " .. name, "info")
        UpdateConsoleDisplay()
    end)
    
    return card
end

-- Section Title
local quickTitle = Instance.new("TextLabel")
quickTitle.Size = UDim2.new(1, 0, 0, 28)
quickTitle.BackgroundTransparency = 1
quickTitle.Text = "  ⚡ Quick Scripts"
quickTitle.TextColor3 = Theme.Accent
quickTitle.Font = Enum.Font.GothamBold
quickTitle.TextSize = 14
quickTitle.TextXAlignment = Enum.TextXAlignment.Left
quickTitle.LayoutOrder = 0
quickTitle.Parent = MoreScroll

CreateQuickScript("Hello World", "Simple print test script", 
[[-- Hello World Test
print("Hello from Linux Executor!")
print("Script executed successfully!")
print("Time: " .. os.date("%H:%M:%S"))]], 1)

CreateQuickScript("Player Info", "Display local player information",
[[-- Player Information
local player = game.Players.LocalPlayer
print("=== Player Info ===")
print("Name: " .. player.Name)
print("Display: " .. player.DisplayName)
print("UserID: " .. player.UserId)
print("Team: " .. tostring(player.Team))
print("Account Age: " .. player.AccountAge .. " days")
print("==================")]], 2)

CreateQuickScript("Part Spawner", "Spawn a neon part at your position",
[[-- Part Spawner
local player = game.Players.LocalPlayer
local char = player.Character or player.CharacterAdded:Wait()
local hrp = char:WaitForChild("HumanoidRootPart")

local part = Instance.new("Part")
part.Size = Vector3.new(4, 4, 4)
part.Position = hrp.Position + Vector3.new(0, 10, 0)
part.BrickColor = BrickColor.new("Lime green")
part.Material = Enum.Material.Neon
part.Anchored = true
part.Parent = workspace

print("Part spawned at: " .. tostring(part.Position))]], 3)

CreateQuickScript("Speed Boost", "Increase walk speed",
[[-- Speed Boost
local player = game.Players.LocalPlayer
local char = player.Character or player.CharacterAdded:Wait()
local humanoid = char:WaitForChild("Humanoid")

humanoid.WalkSpeed = 32
print("Walk speed set to 32!")]], 4)

CreateQuickScript("Jump Boost", "Increase jump power",
[[-- Jump Boost
local player = game.Players.LocalPlayer
local char = player.Character or player.CharacterAdded:Wait()
local humanoid = char:WaitForChild("Humanoid")

humanoid.JumpPower = 100
print("Jump power set to 100!")]], 5)

CreateQuickScript("Game Scanner", "Scan and list workspace children",
[[-- Game Scanner
print("=== Workspace Scan ===")
local count = 0
for _, obj in pairs(workspace:GetChildren()) do
    count = count + 1
    if count <= 25 then
        print(count .. ". [" .. obj.ClassName .. "] " .. obj.Name)
    end
end
print("Total objects: " .. count)
print("====================")]], 6)

-- Tools Section
local toolsTitle = Instance.new("TextLabel")
toolsTitle.Size = UDim2.new(1, 0, 0, 28)
toolsTitle.BackgroundTransparency = 1
toolsTitle.Text = "  🔧 Tools"
toolsTitle.TextColor3 = Theme.Accent
toolsTitle.Font = Enum.Font.GothamBold
toolsTitle.TextSize = 14
toolsTitle.TextXAlignment = Enum.TextXAlignment.Left
toolsTitle.LayoutOrder = 10
toolsTitle.Parent = MoreScroll

-- Tool Buttons Container
local ToolsContainer = Instance.new("Frame")
ToolsContainer.Size = UDim2.new(1, -10, 0, 80)
ToolsContainer.BackgroundColor3 = Theme.Editor
ToolsContainer.BorderSizePixel = 0
ToolsContainer.LayoutOrder = 11
ToolsContainer.Parent = MoreScroll
CreateCorner(ToolsContainer, 8)

local ToolsGrid = Instance.new("UIGridLayout")
ToolsGrid.CellSize = UDim2.new(0.48, 0, 0, 32)
ToolsGrid.CellPadding = UDim2.new(0.02, 0, 0, 6)
ToolsGrid.SortOrder = Enum.SortOrder.LayoutOrder
ToolsGrid.Parent = ToolsContainer

local ToolsPadding = Instance.new("UIPadding")
ToolsPadding.PaddingLeft = UDim.new(0, 6)
ToolsPadding.PaddingTop = UDim.new(0, 6)
ToolsPadding.Parent = ToolsContainer

CreateButton(ToolsContainer, "🔄 Rejoin", UDim2.new(0, 0, 0, 0), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    AddConsoleMessage("Rejoining server...", "system")
    UpdateConsoleDisplay()
    task.wait(0.5)
    game:GetService("TeleportService"):Teleport(game.PlaceId, Player)
end)

CreateButton(ToolsContainer, "🏠 Server Hop", UDim2.new(0, 0, 0, 0), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    AddConsoleMessage("Server hopping...", "system")
    UpdateConsoleDisplay()
end)

CreateButton(ToolsContainer, "📸 Screenshot", UDim2.new(0, 0, 0, 0), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    AddConsoleMessage("Screenshot not available in this environment", "warn")
    UpdateConsoleDisplay()
end)

CreateButton(ToolsContainer, "🔊 Reset Char", UDim2.new(0, 0, 0, 0), UDim2.new(0, 0, 0, 0), Theme.ButtonBG, function()
    local char = Player.Character
    if char then
        local hum = char:FindFirstChild("Humanoid")
        if hum then
            hum.Health = 0
            AddConsoleMessage("Character reset!", "info")
        end
    end
    UpdateConsoleDisplay()
end)

-- ═══════════════════════════════════════════
-- MOBILE TOGGLE BUTTON
-- ═══════════════════════════════════════════
local ToggleButton = Instance.new("TextButton")
ToggleButton.Name = "ToggleButton"
ToggleButton.Size = UDim2.new(0, 46, 0, 46)
ToggleButton.Position = UDim2.new(0, 10, 0.5, -23)
ToggleButton.BackgroundColor3 = Theme.Accent
ToggleButton.Text = ""
ToggleButton.AutoButtonColor = false
ToggleButton.BorderSizePixel = 0
ToggleButton.Visible = true
ToggleButton.ZIndex = 10
ToggleButton.Parent = ScreenGui

CreateCorner(ToggleButton, 23)

local toggleIcon = Instance.new("TextLabel")
toggleIcon.Size = UDim2.new(1, 0, 1, 0)
toggleIcon.BackgroundTransparency = 1
toggleIcon.Text = "🐧"
toggleIcon.TextSize = 22
toggleIcon.Font = Enum.Font.GothamBold
toggleIcon.ZIndex = 11
toggleIcon.Parent = ToggleButton

-- Shadow for toggle
local toggleShadow = Instance.new("ImageLabel")
toggleShadow.BackgroundTransparency = 1
toggleShadow.Image = "rbxassetid://5554236805"
toggleShadow.ImageColor3 = Color3.fromRGB(0, 0, 0)
toggleShadow.ImageTransparency = 0.6
toggleShadow.ScaleType = Enum.ScaleType.Slice
toggleShadow.SliceCenter = Rect.new(23, 23, 277, 277)
toggleShadow.Size = UDim2.new(1, 20, 1, 20)
toggleShadow.Position = UDim2.new(0, -10, 0, -10)
toggleShadow.ZIndex = 9
toggleShadow.Parent = ToggleButton

-- Toggle pulse animation
spawn(function()
    while ToggleButton and ToggleButton.Parent do
        Tween(ToggleButton, {Size = UDim2.new(0, 50, 0, 50), Position = UDim2.new(0, 8, 0.5, -25)}, 1)
        task.wait(1)
        Tween(ToggleButton, {Size = UDim2.new(0, 46, 0, 46), Position = UDim2.new(0, 10, 0.5, -23)}, 1)
        task.wait(1)
    end
end)

local mainVisible = true
ToggleButton.MouseButton1Click:Connect(function()
    mainVisible = not mainVisible
    
    if mainVisible then
        MainFrame.Visible = true
        Tween(MainFrame, {
            Size = UDim2.new(0, mainWidth, 0, mainHeight),
            BackgroundTransparency = 0,
            Rotation = 0
        }, 0.4, Enum.EasingStyle.Back)
        Tween(toggleIcon, {Rotation = 360}, 0.5)
    else
        Tween(MainFrame, {
            Size = UDim2.new(0, 0, 0, 0),
            BackgroundTransparency = 1,
            Rotation = -10
        }, 0.3, Enum.EasingStyle.Quint)
        Tween(toggleIcon, {Rotation = 0}, 0.5)
        task.wait(0.3)
        MainFrame.Visible = false
    end
end)

-- Mobile drag for toggle button
local toggleDragging = false
local toggleDragStart, toggleStartPos

ToggleButton.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
        toggleDragging = true
        toggleDragStart = input.Position
        toggleStartPos = ToggleButton.Position
    end
end)

ToggleButton.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
        toggleDragging = false
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if toggleDragging and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then
        local delta = input.Position - toggleDragStart
        local mag = delta.Magnitude
        if mag > 10 then -- Only drag if moved enough (prevent accidental drags when tapping)
            ToggleButton.Position = UDim2.new(
                toggleStartPos.X.Scale, toggleStartPos.X.Offset + delta.X,
                toggleStartPos.Y.Scale, toggleStartPos.Y.Offset + delta.Y
            )
        end
    end
end)

-- ═══════════════════════════════════════════
-- SET DEFAULT TAB (Editor)
-- ═══════════════════════════════════════════
task.wait(0.1) -- Wait for animations

-- Activate Editor tab by default
for tName, tData in pairs(tabs) do
    if tName == "Editor" then
        tData.Button.BackgroundColor3 = Theme.TabActive
        tData.Label.TextColor3 = Color3.fromRGB(255, 255, 255)
        tData.Page.Visible = true
        Tween(tData.Indicator, {Size = UDim2.new(0.6, 0, 0, 2)}, 0.3, Enum.EasingStyle.Back)
    else
        tData.Button.BackgroundColor3 = Theme.TabInactive
        tData.Label.TextColor3 = Theme.TextDim
        tData.Page.Visible = false
    end
end
currentTab = "Editor"

-- ═══════════════════════════════════════════
-- RESIZE HANDLE (Desktop)
-- ═══════════════════════════════════════════
if not isMobile then
    local ResizeHandle = Instance.new("TextButton")
    ResizeHandle.Name = "ResizeHandle"
    ResizeHandle.Size = UDim2.new(0, 18, 0, 18)
    ResizeHandle.Position = UDim2.new(1, -18, 1, -18)
    ResizeHandle.BackgroundTransparency = 1
    ResizeHandle.Text = "◢"
    ResizeHandle.TextColor3 = Theme.TextDim
    ResizeHandle.TextSize = 14
    ResizeHandle.Font = Enum.Font.GothamBold
    ResizeHandle.ZIndex = 5
    ResizeHandle.Parent = MainFrame
    
    local resizing = false
    local resizeStart, sizeStart
    
    ResizeHandle.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then
            resizing = true
            resizeStart = input.Position
            sizeStart = MainFrame.Size
        end
    end)
    
    ResizeHandle.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then
            resizing = false
        end
    end)
    
    UserInputService.InputChanged:Connect(function(input)
        if resizing and input.UserInputType == Enum.UserInputType.MouseMovement then
            local delta = input.Position - resizeStart
            local newWidth = math.max(400, sizeStart.X.Offset + delta.X)
            local newHeight = math.max(300, sizeStart.Y.Offset + delta.Y)
            MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
        end
    end)
end

-- ═══════════════════════════════════════════
-- STARTUP NOTIFICATION
-- ═══════════════════════════════════════════
local Notification = Instance.new("Frame")
Notification.Name = "Notification"
Notification.Size = UDim2.new(0, 260, 0, 50)
Notification.Position = UDim2.new(0.5, -130, 0, -60)
Notification.BackgroundColor3 = Theme.Accent
Notification.BorderSizePixel = 0
Notification.ZIndex = 20
Notification.Parent = ScreenGui

CreateCorner(Notification, 10)
CreateShadow(Notification)

local NotifLabel = Instance.new("TextLabel")
NotifLabel.Size = UDim2.new(1, 0, 1, 0)
NotifLabel.BackgroundTransparency = 1
NotifLabel.Text = "🐧 Linux Executor v2.0 Loaded!"
NotifLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
NotifLabel.Font = Enum.Font.GothamBold
NotifLabel.TextSize = 14
NotifLabel.ZIndex = 21
NotifLabel.Parent = Notification

-- Slide in notification
Tween(Notification, {Position = UDim2.new(0.5, -130, 0, 50)}, 0.6, Enum.EasingStyle.Back)

task.wait(2.5)

-- Slide out notification
Tween(Notification, {Position = UDim2.new(0.5, -130, 0, -60)}, 0.4, Enum.EasingStyle.Quint)
task.wait(0.5)
Notification:Destroy()

-- ═══════════════════════════════════════════
-- CLEANUP ON PLAYER LEAVE
-- ═══════════════════════════════════════════
Player.AncestryChanged:Connect(function()
    if logConnection then
        logConnection:Disconnect()
    end
end)

print("[Linux Executor] v2.0 loaded successfully!")
print("[Linux Executor] Platform: " .. (isMobile and "Mobile" or "Desktop"))

Features & Information

The Linux Executor provides a new Executor to use with animations console INFO and pre made scripts Linux has everything you need
#Made by Educationalist

Community Comments (2)

rqcccrqcccFeb 7, 2026

ai

Replying to @rqccc
CoolkidfaceCoolkidfaceMay 28, 2026

@rqccc yes

More Scripts for Universal Scripts