--[[ WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk! ]] -- █████╗ ██████╗ ██████╗██╗ ██╗ ██████╗ ███████╗ -- ██╔══██╗██╔══██╗██╔════╝██║ ██║██╔═══██╗██╔════╝ -- ███████║██████╔╝██║ ███████║██║ ██║███████╗ -- ██╔══██║██╔══██╗██║ ██╔══██║██║ ██║╚════██║ -- ██║ ██║██║ ██║╚██████╗██║ ██║╚██████╔╝███████║ -- ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ -- v3.0 — Arch Linux Edition -- "I use Arch btw" — Paste into executor local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer -- ── CONTAINER ────────────────────────────────────────────────── local guiParent = (gethui and gethui()) or game:GetService("CoreGui") -- Remove old copy local old = guiParent:FindFirstChild("ArchOS_v3") if old then old:Destroy() end task.wait() local gui = Instance.new("ScreenGui") gui.Name = "ArchOS_v3" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Global gui.IgnoreGuiInset = true gui.Parent = guiParent -- ── THEMES ────────────────────────────────────────────────────── local Themes = { ArchLinux = { name = "ArchLinux", bg1 = Color3.fromRGB(12, 12, 12), -- Pure dark bg2 = Color3.fromRGB(18, 18, 18), -- Slightly lighter surface = Color3.fromRGB(24, 24, 24), -- Surface surface2 = Color3.fromRGB(32, 32, 32), -- Elevated surface border = Color3.fromRGB(23, 147, 209), -- Arch blue accent = Color3.fromRGB(23, 147, 209), -- Arch blue #1793D1 accent2 = Color3.fromRGB(8, 109, 156), -- Dark Arch blue accentDk = Color3.fromRGB(8, 109, 156), -- Dark blue text = Color3.fromRGB(255, 255, 255), -- Pure white textDim = Color3.fromRGB(180, 180, 180), -- Gray textMut = Color3.fromRGB(100, 100, 100), -- Muted gray green = Color3.fromRGB(0, 255, 0), -- Terminal green red = Color3.fromRGB(255, 0, 0), -- Terminal red yellow = Color3.fromRGB(255, 255, 0), -- Terminal yellow term = Color3.fromRGB(0, 0, 0), -- Pure black terminal termTxt = Color3.fromRGB(255, 255, 255), -- White terminal text close = Color3.fromRGB(255, 0, 0), -- Red minimize = Color3.fromRGB(255, 255, 0), -- Yellow maximize = Color3.fromRGB(0, 255, 0), -- Green winTitle = Color3.fromRGB(18, 18, 18), -- Dark title bar gradA = Color3.fromRGB(0,0,0), gradB = Color3.fromRGB(12,12,12), dotCol = Color3.fromRGB(23,147,209), -- Arch blue dots }, ArchClassic = { name = "ArchClassic", bg1 = Color3.fromRGB(8, 8, 8), -- Even darker bg2 = Color3.fromRGB(15, 15, 15), surface = Color3.fromRGB(20, 20, 20), surface2 = Color3.fromRGB(28, 28, 28), border = Color3.fromRGB(23, 147, 209), -- Arch blue accent = Color3.fromRGB(23, 147, 209), -- Arch blue accent2 = Color3.fromRGB(51, 181, 229), -- Light blue accentDk = Color3.fromRGB(8, 109, 156), text = Color3.fromRGB(220, 220, 220), textDim = Color3.fromRGB(150, 150, 150), textMut = Color3.fromRGB(80, 80, 80), green = Color3.fromRGB(138, 226, 52), -- Arch wiki green red = Color3.fromRGB(204, 0, 0), yellow = Color3.fromRGB(252, 233, 79), term = Color3.fromRGB(0, 0, 0), termTxt = Color3.fromRGB(220, 220, 220), close = Color3.fromRGB(204, 0, 0), minimize = Color3.fromRGB(252, 233, 79), maximize = Color3.fromRGB(138, 226, 52), winTitle = Color3.fromRGB(15, 15, 15), gradA = Color3.fromRGB(0,0,0), gradB = Color3.fromRGB(8,8,8), dotCol = Color3.fromRGB(23,147,209), }, ArchMonokai = { name = "ArchMonokai", bg1 = Color3.fromRGB(39, 40, 34), -- Monokai background bg2 = Color3.fromRGB(46, 47, 41), surface = Color3.fromRGB(54, 55, 49), surface2 = Color3.fromRGB(62, 63, 57), border = Color3.fromRGB(102, 217, 239), -- Monokai cyan accent = Color3.fromRGB(102, 217, 239), -- Cyan accent2 = Color3.fromRGB(166, 226, 46), -- Green accentDk = Color3.fromRGB(73, 156, 171), text = Color3.fromRGB(248, 248, 242), -- Monokai white textDim = Color3.fromRGB(117, 113, 94), -- Comment textMut = Color3.fromRGB(117, 113, 94), green = Color3.fromRGB(166, 226, 46), -- Monokai green red = Color3.fromRGB(249, 38, 114), -- Monokai pink/red yellow = Color3.fromRGB(230, 219, 116), -- Monokai yellow term = Color3.fromRGB(30, 31, 25), termTxt = Color3.fromRGB(248, 248, 242), close = Color3.fromRGB(249, 38, 114), minimize = Color3.fromRGB(230, 219, 116), maximize = Color3.fromRGB(166, 226, 46), winTitle = Color3.fromRGB(46, 47, 41), gradA = Color3.fromRGB(30,31,25), gradB = Color3.fromRGB(39,40,34), dotCol = Color3.fromRGB(102,217,239), }, } local T = Themes.ArchLinux -- current theme local ActiveTheme = "ArchLinux" -- ── HELPERS ──────────────────────────────────────────────────── local function tw(obj, props, t, style) TweenService:Create(obj, TweenInfo.new(t or .18, style or Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play() end local function c(cls, props, parent) local o = Instance.new(cls) for k,v in pairs(props) do pcall(function() o[k] = v end) end if parent then o.Parent = parent end return o end local function corner(p, r) return c("UICorner", {CornerRadius = UDim.new(0, r or 8)}, p) end local function stroke(p, col, thick, trans) return c("UIStroke", {Color = col or T.border, Thickness = thick or 1, Transparency = trans or .4}, p) end local function pad(p, px) local u = Instance.new("UIPadding") u.PaddingLeft = UDim.new(0, px) u.PaddingRight = UDim.new(0, px) u.PaddingTop = UDim.new(0, px) u.PaddingBottom = UDim.new(0, px) u.Parent = p end local function gradient(p, a, b, rot) local g = Instance.new("UIGradient") g.Color = ColorSequence.new(a, b) g.Rotation = rot or 0 g.Parent = p return g end local function hover(btn, norm, hov, prop) prop = prop or "BackgroundColor3" btn.MouseEnter:Connect(function() tw(btn, {[prop]=hov}) end) btn.MouseLeave:Connect(function() tw(btn, {[prop]=norm}) end) end local function shadow(parent, zIdx) local s = c("Frame", { Size = UDim2.new(1, 20, 1, 20), Position = UDim2.new(0, -10, 0, -10), BackgroundColor3 = Color3.new(0,0,0), BackgroundTransparency = .65, ZIndex = zIdx - 1, BorderSizePixel = 0, }, parent) corner(s, 14) return s end -- ── NOTIFICATION SYSTEM ─────────────────────────────────────── local notifContainer = c("Frame", { Size = UDim2.new(0, 340, 1, 0), Position = UDim2.new(1, -350, 0, 10), BackgroundTransparency = 1, ZIndex = 8000, }, gui) c("UIListLayout", { Padding = UDim.new(0, 8), VerticalAlignment = Enum.VerticalAlignment.Top, SortOrder = Enum.SortOrder.LayoutOrder, }, notifContainer) local function notify(title, text, duration, icon) local nf = c("Frame", { Size = UDim2.new(1, 0, 0, 70), BackgroundColor3 = T.bg2, BorderSizePixel = 0, ZIndex = 8001, BackgroundTransparency = 1, }, notifContainer) corner(nf, 10) stroke(nf, T.accent, 1, .3) -- Accent bar on left local bar = c("Frame", { Size = UDim2.new(0, 4, 1, -8), Position = UDim2.new(0, 4, 0, 4), BackgroundColor3 = T.accent, BorderSizePixel = 0, ZIndex = 8002, }, nf) corner(bar, 2) c("TextLabel", { Size = UDim2.new(0, 30, 0, 30), Position = UDim2.new(0, 14, 0, 8), BackgroundTransparency = 1, Text = icon or "🔔", TextSize = 20, ZIndex = 8002, }, nf) c("TextLabel", { Size = UDim2.new(1, -60, 0, 22), Position = UDim2.new(0, 48, 0, 6), BackgroundTransparency = 1, Text = title, Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = T.text, TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 8002, }, nf) c("TextLabel", { Size = UDim2.new(1, -60, 0, 30), Position = UDim2.new(0, 48, 0, 28), BackgroundTransparency = 1, Text = text, Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = T.textDim, TextXAlignment = Enum.TextXAlignment.Left, TextWrapped = true, ZIndex = 8002, }, nf) -- Appear animation tw(nf, {BackgroundTransparency = 0}, .3) task.delay(duration or 4, function() tw(nf, {BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 0)}, .3) task.delay(.35, function() nf:Destroy() end) end) end -- ── FILE SYSTEM ─────────────────────────────────────────────── local FS = {} local CWD = "/home/"..player.Name:lower() local function fsNew(t, content) return {t=t, content=content or "", children={}, time=os.time()} end FS["/"] = fsNew("dir") FS["/bin"] = fsNew("dir") FS["/boot"] = fsNew("dir") FS["/etc"] = fsNew("dir") FS["/home"] = fsNew("dir") FS["/home/"..player.Name:lower()] = fsNew("dir") FS["/home/"..player.Name:lower().."/Documents"] = fsNew("dir") FS["/home/"..player.Name:lower().."/Downloads"] = fsNew("dir") FS["/opt"] = fsNew("dir") FS["/tmp"] = fsNew("dir") FS["/usr"] = fsNew("dir") FS["/usr/bin"] = fsNew("dir") FS["/var"] = fsNew("dir") FS["/var/log"] = fsNew("dir") local function regChild(parent, child) if FS[parent] then table.insert(FS[parent].children, child) end end regChild("/", "/bin") regChild("/", "/boot") regChild("/", "/etc") regChild("/", "/home") regChild("/", "/opt") regChild("/", "/tmp") regChild("/", "/usr") regChild("/", "/var") regChild("/home", "/home/"..player.Name:lower()) regChild("/home/"..player.Name:lower(),"/home/"..player.Name:lower().."/Documents") regChild("/home/"..player.Name:lower(),"/home/"..player.Name:lower().."/Downloads") regChild("/usr", "/usr/bin") regChild("/var", "/var/log") local function mkf(path, content, parent) FS[path] = fsNew("file", content) if parent then regChild(parent, path) end end mkf("/etc/hostname", "archos-roblox", "/etc") mkf("/etc/motd", "Welcome to Arch Linux!\nType 'help' for available commands.\n'man archlinux' for system info.\nBTW, you're using Arch.\n", "/etc") mkf("/etc/os-release", "NAME=\"Arch Linux\"\nID=arch\nVERSION_ID=\"rolling\"\nBUILD_ID=rolling\nPRETTY_NAME=\"Arch Linux\"\nHOME_URL=\"https://archlinux.org/\"\n", "/etc") mkf("/etc/passwd", "root:x:0:0::/root:/bin/bash\n"..player.Name:lower()..":x:1000:1000::"..CWD..":/bin/bash\n", "/etc") mkf("/etc/pacman.conf", "[options]\nArchitecture = auto\nColor\nILoveCandy\nParallelDownloads = 5\n\n[core]\nInclude = /etc/pacman.d/mirrorlist\n\n[extra]\nInclude = /etc/pacman.d/mirrorlist\n", "/etc") mkf("/home/"..player.Name:lower().."/README.md", "# Welcome to ArchOS v3.0\n\n**I use Arch btw**\n\n## Features:\n- Pacman package manager\n- Rolling release system\n- 3 Arch themes\n- Full terminal with Arch commands\n- System monitor & task manager\n\n## Quick Start:\n```bash\nneofetch # System info\npacman -Syu # System update\npacman -S firefox # Install package\nhtop # Process monitor\n```\n\nType 'help' in terminal for all commands!\n", "/home/"..player.Name:lower()) mkf("/home/"..player.Name:lower().."/TODO.md", "# TODO List\n\n- [x] Install Arch Linux\n- [ ] Configure i3wm\n- [ ] Set up AUR helper\n- [ ] Rice the desktop\n- [ ] Tell everyone you use Arch\n", "/home/"..player.Name:lower()) mkf("/home/"..player.Name:lower().."/Documents/notes.txt", "# Arch Linux Notes\n\n## Why Arch?\n- Rolling release = always up to date\n- Minimalist base installation\n- AUR = Arch User Repository\n- Pacman is blazingly fast\n- You can tell people you use Arch\n\n## Essential Commands:\n- sudo pacman -Syu (update system)\n- pacman -Ss (search package)\n- pacman -S (install package)\n- pacman -R (remove package)\n", "/home/"..player.Name:lower().."/Documents") mkf("/tmp/session.log", "Session started: "..os.date("%H:%M:%S").."\nArch Linux rolling release\n", "/tmp") mkf("/var/log/pacman.log", "["..(os.date("%Y-%m-%d %H:%M")).."] [PACMAN] Running 'pacman -Syu'\n["..(os.date("%Y-%m-%d %H:%M")).."] [PACMAN] synchronizing package lists\n["..(os.date("%Y-%m-%d %H:%M")).."] [PACMAN] starting full system upgrade\n["..(os.date("%Y-%m-%d %H:%M")).."] [ALPM] upgraded linux (6.6.1-arch1-1 -> 6.6.2-arch1-1)\n", "/var/log") mkf("/var/log/kernel.log", "[ 0.000000] Linux version 6.6.2-arch1-1 (linux@archlinux)\n[ 0.001234] Command line: BOOT_IMAGE=/vmlinuz-linux root=UUID=XXXX rw loglevel=3\n[ 0.002456] Kernel command line: BOOT_IMAGE=/vmlinuz-linux root=UUID=XXXX rw\n[ 0.045678] Arch Linux initialized\n[ 0.067890] systemd initialized\n", "/var/log") local function fsResolve(path) if path == "~" then return CWD end if path:sub(1,2) == "~/" then path = CWD .. "/" .. path:sub(3) end if path:sub(1,1) ~= "/" then path = (CWD == "/" and "/"..path) or (CWD.."/"..path) end local parts = {} for seg in path:gmatch("[^/]+") do if seg == ".." then table.remove(parts) elseif seg ~= "." then table.insert(parts, seg) end end return (#parts == 0 and "/") or ("/"..table.concat(parts,"/")) end local function fsRead(path) local nd = FS[fsResolve(path)] return nd and nd.t == "file" and nd.content or nil end local function fsWrite(path, content) local abs = fsResolve(path) if FS[abs] then FS[abs].content = content FS[abs].time = os.time() else FS[abs] = fsNew("file", content) local parentPath = abs:match("(.+)/[^/]+$") or "/" if FS[parentPath] and FS[parentPath].t == "dir" then table.insert(FS[parentPath].children, abs) end end end local function fsList(path) local node = FS[fsResolve(path)] return node and node.t == "dir" and node.children or nil end local function fsMkdir(path) local abs = fsResolve(path) if FS[abs] then return false, "already exists" end FS[abs] = fsNew("dir") local parentPath = abs:match("(.+)/[^/]+$") or "/" if FS[parentPath] and FS[parentPath].t == "dir" then table.insert(FS[parentPath].children, abs) end return true end -- ── KERNEL ─────────────────────────────────────────────────────── local Kernel = { procs={}, pid=1, boot=os.clock() } local function kspawn(name, mem, sys) local id = Kernel.pid; Kernel.pid+=1 Kernel.procs[id] = { pid=id, name=name, state="running", mem=mem or math.random(2,18), cpu=0, start=os.clock(), sys=sys or false } return id end local function kkill(pid) if not Kernel.procs[pid] then return false, "no process" end if Kernel.procs[pid].sys then return false, "system process" end Kernel.procs[pid] = nil return true end kspawn("systemd", 2, true) kspawn("systemd-journald", 3, true) kspawn("dbus-daemon", 2, true) kspawn("arch-wm", 6, true) kspawn("pacman", 4, true) RunService.Heartbeat:Connect(function(dt) for _, p in pairs(Kernel.procs) do p.cpu += dt * math.random(1,12)/100 end end) -- ── DESKTOP ─────────────────────────────────────────────────── local desktop = c("Frame", { Size=UDim2.new(1,0,1,0), BackgroundColor3=T.bg1, BorderSizePixel=0, ZIndex=1, }, gui) local desktopGrad = gradient(desktop, T.gradA, T.gradB, 135) -- Dot grid local dots = c("Frame", { Size=UDim2.new(1,0,1,0), BackgroundTransparency=1, ZIndex=1, }, desktop) do local rows, cols = 20, 35 for r=0, rows do for cc=0, cols do c("Frame", { Size=UDim2.new(0,2,0,2), Position=UDim2.new(cc/cols, 0, r/rows, 0), BackgroundColor3=T.dotCol, BackgroundTransparency=0.6, BorderSizePixel=0, ZIndex=1, }, dots) end end end -- ── WINDOWS SYSTEM ───────────────────────────────────────────── local Z = 10 local WINS = {} local OpenWinNames = {} -- for taskbar local function makeDrag(handle, win) local drag, dstart, dpos = false, nil, nil handle.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 then drag=true; dstart=i.Position; dpos=win.Position i.Changed:Connect(function() if i.UserInputState==Enum.UserInputState.End then drag=false end end) end end) UIS.InputChanged:Connect(function(i) if drag and i.UserInputType==Enum.UserInputType.MouseMovement then local d=i.Position-dstart win.Position=UDim2.new(dpos.X.Scale, dpos.X.Offset+d.X, dpos.Y.Scale, dpos.Y.Offset+d.Y) end end) end local refreshTaskbar -- forward declare local function newWindow(title, w, h, x, y) Z+=1 local z = Z local win = c("Frame", { Size=UDim2.new(0,w,0,h), Position=UDim2.new(0,x or 200,0,y or 100), BackgroundColor3=T.surface, BorderSizePixel=0, ZIndex=z, ClipsDescendants=true, }, gui) corner(win, 10) stroke(win, T.accent, 1, .5) shadow(win, z) win.InputBegan:Connect(function(i) if i.UserInputType==Enum.UserInputType.MouseButton1 then Z+=1; win.ZIndex=Z end end) -- Title bar local bar = c("Frame", { Size=UDim2.new(1,0,0,38), BackgroundColor3=T.winTitle, BorderSizePixel=0, ZIndex=z+1, }, win) c("Frame", { Size=UDim2.new(1,0,0,1), Position=UDim2.new(0,0,1,-1), BackgroundColor3=T.accent, BackgroundTransparency=0.7, BorderSizePixel=0, ZIndex=z+2, }, bar) corner(bar, 10) c("Frame", { Size=UDim2.new(1,0,0.5,0), Position=UDim2.new(0,0,0.5,0), BackgroundColor3=T.winTitle, BorderSizePixel=0, ZIndex=z+1, }, bar) -- Control buttons (●●●) local function wbtn(col, xoff, sym, cb) local b = c("TextButton", { Size=UDim2.new(0,14,0,14), Position=UDim2.new(1,xoff,0.5,-7), BackgroundColor3=col, Text="", ZIndex=z+3, BorderSizePixel=0, }, bar) corner(b,7) local lbl=c("TextLabel", { Size=UDim2.new(1,0,1,0), BackgroundTransparency=1, Text=sym, TextColor3=Color3.new(0,0,0), Font=Enum.Font.GothamBold, TextSize=9, Visible=false, ZIndex=z+4, },b) b.MouseEnter:Connect(function() lbl.Visible=true end) b.MouseLeave:Connect(function() lbl.Visible=false end) b.MouseButton1Click:Connect(cb) return b end local mini=false local maxi=false local orig=UDim2.new(0,w,0,h) local origPos=UDim2.new(0,x or 200,0,y or 100) local body -- Close wbtn(T.close, -22, "✕", function() tw(win,{Size=UDim2.new(0,w,0,0),BackgroundTransparency=1},.2) task.delay(.25, function() win:Destroy() WINS[title]=nil OpenWinNames[title]=nil if refreshTaskbar then refreshTaskbar() end end) end) -- Minimize wbtn(T.minimize, -40, "─", function() if mini then tw(win,{Size=orig},.2) if body then body.Visible=true end mini=false else tw(win,{Size=UDim2.new(0,w,0,38)},.2) task.delay(.15,function() if body then body.Visible=false end end) mini=true end end) -- Maximize wbtn(T.maximize, -58, "□", function() if maxi then tw(win,{Size=orig, Position=origPos},.25) maxi=false else origPos=win.Position orig=win.Size tw(win,{Size=UDim2.new(1,0,1,-44), Position=UDim2.new(0,0,0,0)},.25) maxi=true end if mini then mini=false if body then body.Visible=true end end end) -- Title text c("TextLabel", { Size=UDim2.new(1,-120,1,0), Position=UDim2.new(0,14,0,0), BackgroundTransparency=1, Text=title, Font=Enum.Font.GothamBold, TextSize=13, TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+2, }, bar) body = c("Frame", { Size=UDim2.new(1,0,1,-38), Position=UDim2.new(0,0,0,38), BackgroundTransparency=1, ZIndex=z+1, ClipsDescendants=true, }, win) makeDrag(bar, win) -- Appear animation win.Size=UDim2.new(0,w,0,0) win.BackgroundTransparency=1 tw(win,{Size=UDim2.new(0,w,0,h), BackgroundTransparency=0},.25,Enum.EasingStyle.Back) WINS[title]=win OpenWinNames[title]=true if refreshTaskbar then refreshTaskbar() end return win, body, z end -- ── TERMINAL COMMANDS ──────────────────────────────────────── local cmdHistory = {} local Fortunes = { "I use Arch btw.", "Pacman says: Wakka wakka wakka!", "There are no bugs in Arch, only features you haven't configured yet.", "sudo rm -rf / --no-preserve-root (Don't actually run this.)", "The AUR is a pathway to many packages some consider to be... unstable.", "Gentoo users still compiling while you're gaming.", "RTFM — Read The Friendly Manual (it's on the wiki).", "ArchWiki > Stack Overflow", "systemd is not the enemy, embrace it.", "Your system is bleeding edge... and sometimes it bleeds.", "Rolling release = always fresh, always broken.", "Kernel panic? Time for a kernel parameter!", "If it compiles, ship it. If it doesn't, check the AUR.", "The best time to switch to Arch was yesterday. The second best time is now.", "sudo pacman -Syu # The most dangerous command.", } local function runCmd(cmd, out) local args={} for a in cmd:gmatch("%S+") do table.insert(args,a) end local cc=args[1] if not cc or cc=="" then return end table.insert(cmdHistory, cmd) if cc=="help" then out("╔══════════════════════════════════════════════╗", T.accent) out("║ Arch Linux Shell — Command Reference ║", T.accent) out("╠══════════════════════════════════════════════╣", T.accent) out("║ File System: ║", T.accent2) out("║ ls [path] — list directory ║", T.text) out("║ cd [path] — change directory ║", T.text) out("║ cat [file] — display file ║", T.text) out("║ head [file] — first lines ║", T.text) out("║ tail [file] — last lines ║", T.text) out("║ mkdir [dir] — create directory ║", T.text) out("║ touch [file] — create file ║", T.text) out("║ rm [file] — remove file ║", T.text) out("║ mv [src] [dst] — move/rename ║", T.text) out("║ cp [src] [dst] — copy file ║", T.text) out("║ grep [pat] [f] — search in file ║", T.text) out("║ tree [path] — directory tree ║", T.text) out("║ pwd — print working directory ║", T.text) out("╠══════════════════════════════════════════════╣", T.accent2) out("║ Package Management (Pacman): ║", T.accent2) out("║ pacman -Syu — update system ║", T.text) out("║ pacman -S pkg — install package ║", T.text) out("║ pacman -R pkg — remove package ║", T.text) out("║ pacman -Ss pat — search packages ║", T.text) out("║ pacman -Q — list installed ║", T.text) out("╠══════════════════════════════════════════════╣", T.accent2) out("║ System Information: ║", T.accent2) out("║ uname — system info ║", T.text) out("║ neofetch — system info (fancy) ║", T.text) out("║ screenfetch — system info (alt) ║", T.text) out("║ htop — process viewer ║", T.text) out("║ ps — list processes ║", T.text) out("║ kill [pid] — terminate process ║", T.text) out("║ free — memory usage ║", T.text) out("║ df — disk space ║", T.text) out("║ uptime — system uptime ║", T.text) out("║ whoami — current user ║", T.text) out("║ man [cmd] — manual pages ║", T.text) out("║ fortune — random wisdom ║", T.text) out("║ history — command history ║", T.text) out("║ clear — clear screen ║", T.text) out("║ exit — close terminal ║", T.text) out("╚══════════════════════════════════════════════╝", T.accent) elseif cc=="neofetch" or cc=="screenfetch" then local up=os.clock()-Kernel.boot local h=math.floor(up/3600) local m=math.floor(up%3600/60) local cnt=0; local mem=0 for _,p in pairs(Kernel.procs) do cnt+=1; mem+=p.mem end out("", T.text) out(" -` "..player.Name.."@archos", T.accent) out(" .o+` ──────────────────", T.accent) out(" `ooo/ OS: Arch Linux x86_64", T.text) out(" `+oooo: Host: Roblox Runtime", T.text) out(" `+oooooo: Kernel: 6.6.2-arch1-1", T.text) out(" -+oooooo+: Uptime: "..string.format("%dh %dm", h, m), T.text) out(" `/:-:++oooo+: Packages: "..math.random(800,1200).." (pacman)", T.text) out(" `/++++/+++++++: Shell: bash 5.2.21", T.text) out(" `/++++++++++++++: Theme: "..ActiveTheme, T.text) out(" `/+++ooooooooooooo/` WM: arch-wm", T.text) out(" ./ooosssso++osssssso+` Terminal: alacritty", T.text) out(" .oossssso-````/ossssss+` CPU: Luau JIT", T.text) out(" -osssssso. :ssssssso. Memory: "..mem.."MB / 2048MB", T.text) out(" :osssssss/ osssso+++. Procs: "..cnt, T.text) out(" /ossssssss/ +ssssooo/- Player: "..player.DisplayName, T.text) out(" `/ossssso+/:- -:/+osssso+- Uptime: Since "..os.date("%H:%M"), T.text) out(" `+sso+:-` `.-/+oso: ", T.text) out(" `++:. `-/+/ ", T.text) out(" .` `/ ", T.text) out("", T.text) elseif cc=="man" then if not args[2] then out("What manual page do you want?", T.yellow) out("Example: man pacman", T.textDim) elseif args[2]=="pacman" then out("", T.text) out("PACMAN(8) Arch Linux PACMAN(8)", T.accent) out("", T.text) out("NAME", T.accent2) out(" pacman - package manager utility", T.text) out("", T.text) out("SYNOPSIS", T.accent2) out(" pacman [options] [targets]", T.text) out("", T.text) out("DESCRIPTION", T.accent2) out(" Pacman is a package management utility that tracks", T.text) out(" installed packages. It uses simple compressed", T.text) out(" files as a package format.", T.text) out("", T.text) out("OPERATIONS", T.accent2) out(" -S, --sync Synchronize packages", T.text) out(" -R, --remove Remove packages", T.text) out(" -Q, --query Query installed packages", T.text) out(" -Syu Update system", T.text) out("", T.text) out("EXAMPLES", T.accent2) out(" pacman -Syu Update system", T.text) out(" pacman -S firefox Install Firefox", T.text) out(" pacman -R firefox Remove Firefox", T.text) out(" pacman -Ss browser Search for browser", T.text) out("", T.text) elseif args[2]=="archlinux" then out("", T.text) out("ARCH LINUX", T.accent) out("", T.text) out("Arch Linux is an independently developed, x86-64 general-", T.text) out("purpose GNU/Linux distribution that strives to provide the", T.text) out("latest stable versions of most software by following a", T.text) out("rolling-release model.", T.text) out("", T.text) out("PHILOSOPHY", T.accent2) out(" • Simplicity Design without unnecessary additions", T.text) out(" • Modernity Cutting-edge software", T.text) out(" • Pragmatism Principles over ideology", T.text) out(" • User centrality You make the decisions", T.text) out(" • Versatility Handle any task", T.text) out("", T.text) out("KEY FEATURES", T.accent2) out(" • Rolling release model (always up-to-date)", T.text) out(" • Pacman package manager", T.text) out(" • AUR (Arch User Repository)", T.text) out(" • systemd init system", T.text) out(" • Excellent documentation (ArchWiki)", T.text) out("", T.text) out("Learn more at: https://archlinux.org/", T.accent2) out("", T.text) else out("No manual entry for "..args[2], T.red) end elseif cc=="fortune" then out("🔮 "..Fortunes[math.random(#Fortunes)], T.yellow) elseif cc=="pacman" then if args[2]=="-Syu" then out(":: Synchronizing package databases...", T.accent2) task.wait(0.2) out(" core is up to date", T.textDim) out(" extra is up to date", T.textDim) out(" multilib is up to date", T.textDim) out(":: Starting full system upgrade...", T.accent2) task.wait(0.3) out(" there is nothing to do", T.green) elseif args[2]=="-S" then if not args[3] then out("error: no targets specified (use -h for help)", T.red) else local pkg=args[3] out("resolving dependencies...", T.textDim) out("looking for conflicting packages...", T.textDim) out("", T.text) out("Packages (1) "..pkg.."-1.0.0", T.text) out("", T.text) out("Total Download Size: "..math.random(5,50)..".00 MiB", T.text) out("Total Installed Size: "..math.random(10,100)..".00 MiB", T.text) out("", T.text) out(":: Proceed with installation? [Y/n] ", T.accent2) out(":: Retrieving packages...", T.accent2) out(" "..pkg.."-1.0.0-x86_64 "..math.random(5,50)..".0 MiB "..math.random(500,9999).." KiB/s 00:0"..math.random(1,9), T.textDim) out("(1/1) checking keys in keyring", T.textDim) out("(1/1) checking package integrity", T.textDim) out("(1/1) loading package files", T.textDim) out("(1/1) checking for file conflicts", T.textDim) out("(1/1) installing "..pkg.."...", T.textDim) out(":: Transaction successfully finished ✓", T.green) end elseif args[2]=="-R" then if not args[3] then out("error: no targets specified (use -h for help)", T.red) else out("checking dependencies...", T.textDim) out("", T.text) out("Packages (1) "..args[3].."-1.0.0", T.text) out("", T.text) out("Total Removed Size: "..math.random(10,100)..".00 MiB", T.text) out("", T.text) out(":: Do you want to remove these packages? [Y/n]", T.accent2) out("(1/1) removing "..args[3].."...", T.textDim) out(":: Transaction successfully finished ✓", T.green) end elseif args[2]=="-Ss" then if not args[3] then out("error: no targets specified", T.red) else local fake={"firefox","chromium","brave","vivaldi","qutebrowser"} out("Searching repositories for '"..args[3].."'...", T.accent2) out("", T.text) for _,pk in ipairs(fake) do if pk:lower():find(args[3]:lower()) then out("extra/"..pk.." 120.0-1", T.accent) out(" "..pk.." web browser", T.textDim) end end end elseif args[2]=="-Q" then local pkgs={"base","linux","pacman","systemd","bash","gcc","git","vim","neofetch"} out("Installed packages:", T.accent2) for _,pk in ipairs(pkgs) do out(" "..pk.." 1.0.0-"..math.random(1,5), T.text) end else out("usage: pacman [...]", T.yellow) out("operations:", T.text) out(" -Syu update system", T.text) out(" -S install package", T.text) out(" -R remove package", T.text) out(" -Ss search packages", T.text) out(" -Q list installed packages", T.text) end elseif cc=="htop" then out("Opening htop (process monitor)...", T.accent2) task.wait(0.3) openTaskManager() elseif cc=="free" then local total=2048; local used=0 for _,p in pairs(Kernel.procs) do used+=p.mem end local free=total-used local pct=math.floor(used/total*100) out(" total used free", T.accent) out(string.format("Mem: %4dMB %4dMB %4dMB", total, used, free), T.text) out("", T.text) out("Memory usage: "..pct.."%", pct>80 and T.red or T.green) elseif cc=="df" then out("Filesystem Size Used Avail Use% Mounted on", T.accent) out("/dev/sda1 50G 12G 36G 26% /", T.text) out("/dev/sda2 200G 48G 142G 26% /home", T.text) out("tmpfs 1.0G 120K 1.0G 1% /tmp", T.text) elseif cc=="history" then out(" Command history:", T.accent) for i, cmd2 in ipairs(cmdHistory) do out(string.format(" %4d %s", i, cmd2), T.text) end elseif cc=="tree" then local path = args[2] and fsResolve(args[2]) or CWD local function printTree(p, prefix) local nd = FS[p] if not nd or nd.t ~= "dir" then return end local ch = nd.children for i, cp in ipairs(ch) do local child = FS[cp] if not child then continue end local segs = cp:split("/") local nm = segs[#segs] local isLast = (i == #ch) local connector = isLast and "└── " or "├── " local icon = child.t == "dir" and "📁 " or "📄 " out(prefix .. connector .. icon .. nm, child.t == "dir" and T.accent2 or T.text) if child.t == "dir" then local newPrefix = prefix .. (isLast and " " or "│ ") printTree(cp, newPrefix) end end end local segs = path:split("/") out("📂 " .. (segs[#segs] ~= "" and segs[#segs] or "/"), T.accent) printTree(path, "") elseif cc=="mkdir" then if not args[2] then out("mkdir: missing operand", T.yellow); return end local ok, err = fsMkdir(args[2]) if ok then out("Created directory: "..fsResolve(args[2]), T.textDim) else out("mkdir: "..tostring(err), T.red) end elseif cc=="mv" then if not args[2] or not args[3] then out("mv: missing file operand", T.yellow); return end local src = fsResolve(args[2]) local dst = fsResolve(args[3]) if not FS[src] then out("mv: cannot stat '"..args[2].."': No such file", T.red); return end FS[dst] = FS[src] FS[dst].time = os.time() FS[src] = nil for _, nd in pairs(FS) do if nd.t == "dir" then for i, ch in ipairs(nd.children) do if ch == src then nd.children[i] = dst; break end end end end out("'"..src.."' -> '"..dst.."'", T.textDim) elseif cc=="cp" then if not args[2] or not args[3] then out("cp: missing file operand", T.yellow); return end local src = fsResolve(args[2]) local dst = fsResolve(args[3]) if not FS[src] or FS[src].t ~= "file" then out("cp: cannot stat '"..args[2].."'", T.red); return end fsWrite(dst, FS[src].content) out("'"..src.."' -> '"..dst.."'", T.textDim) elseif cc=="grep" then if not args[2] or not args[3] then out("grep: usage: grep PATTERN FILE", T.yellow); return end local pattern = args[2] local content = fsRead(fsResolve(args[3])) if not content then out("grep: "..args[3]..": No such file", T.red); return end local found = 0 for _, ln in ipairs(content:split("\n")) do if ln:lower():find(pattern:lower()) then out(ln, T.green) found += 1 end end if found == 0 then out("(no matches)", T.textDim) end elseif cc=="head" then if not args[2] then out("head: missing operand", T.yellow); return end local content = fsRead(fsResolve(args[2])) if not content then out("head: cannot open '"..args[2].."'", T.red); return end local lines = content:split("\n") local count = tonumber(args[3]) or 10 for i = 1, math.min(count, #lines) do out(lines[i], T.text) end elseif cc=="tail" then if not args[2] then out("tail: missing operand", T.yellow); return end local content = fsRead(fsResolve(args[2])) if not content then out("tail: cannot open '"..args[2].."'", T.red); return end local lines = content:split("\n") local count = tonumber(args[3]) or 10 for i = math.max(1, #lines - count + 1), #lines do out(lines[i], T.text) end elseif cc=="ls" then local path = args[2] and fsResolve(args[2]) or CWD local ch = fsList(path) if not ch then out("ls: cannot access '"..path.."': No such directory", T.red); return end if #ch==0 then out("(empty)", T.textDim); return end for _, cp in ipairs(ch) do local nd=FS[cp] if nd then local segs=cp:split("/") local nm=segs[#segs] if nd.t=="dir" then out(" 📁 "..nm.."/", T.accent2) else out(string.format(" 📄 %-26s %5dB", nm, #nd.content), T.text) end end end elseif cc=="cd" then local p = args[2] and fsResolve(args[2]) or ("/home/"..player.Name:lower()) if FS[p] and FS[p].t=="dir" then CWD=p; out("→ "..CWD, T.textDim) else out("cd: "..tostring(args[2])..": No such directory", T.red) end elseif cc=="pwd" then out(CWD, T.text) elseif cc=="cat" then if not args[2] then out("cat: missing operand", T.yellow); return end local content=fsRead(fsResolve(args[2])) if content then for _,ln in ipairs(content:split("\n")) do out(ln, T.text) end else out("cat: "..args[2]..": No such file", T.red) end elseif cc=="echo" then local full=table.concat(args," ",2) local lpart, rpart=full:match("^(.-)%s*>%s*(.+)$") if lpart and rpart then fsWrite(fsResolve(rpart), lpart.."\n") out("→ "..rpart, T.textDim) else out(full, T.text) end elseif cc=="touch" then if not args[2] then out("touch: missing file operand", T.yellow); return end local abs=fsResolve(args[2]) if not FS[abs] then fsWrite(abs,""); out("Created: "..abs, T.textDim) else FS[abs].time=os.time(); out("Updated timestamp", T.textDim) end elseif cc=="rm" then if not args[2] then out("rm: missing operand", T.yellow); return end local abs=fsResolve(args[2]) if not FS[abs] then out("rm: cannot remove '"..args[2].."': No such file", T.red); return end if FS[abs].t=="dir" then out("rm: cannot remove '"..args[2].."': Is a directory", T.red); return end FS[abs]=nil for _, nd in pairs(FS) do if nd.t=="dir" then for i,ch in ipairs(nd.children) do if ch==abs then table.remove(nd.children,i); break end end end end out("removed '"..abs.."'", T.textDim) elseif cc=="ps" then out(string.format(" %-6s %-24s %-10s %s","PID","CMD","STAT","RSS"), T.accent) out(" "..("─"):rep(56), T.textMut) local sorted={} for _,p in pairs(Kernel.procs) do table.insert(sorted,p) end table.sort(sorted,function(a,b) return a.pid80 and T.red or pct>50 and T.yellow or T.accent end) task.spawn(function() while win and win.Parent do refresh(); task.wait(0.5) end conn:Disconnect() end) refresh() end -- ── BROWSER ──────────────────────────────────────────────────── openBrowser = function() if WINS["Browser"] and WINS["Browser"].Parent then WINS["Browser"].Visible=true; return end local win,body,z = newWindow(" 🌐 Firefox", 620, 460, 180, 80) local bg=c("Frame",{Size=UDim2.new(1,0,1,0), BackgroundColor3=Color3.fromRGB(240,242,245), BorderSizePixel=0,ZIndex=z+1},body) local addrRow=c("Frame",{ Size=UDim2.new(1,-16,0,36), Position=UDim2.new(0,8,0,6), BackgroundColor3=Color3.new(1,1,1), BorderSizePixel=0,ZIndex=z+2},bg) corner(addrRow,18); stroke(addrRow,T.accent,1,.3) local addrBox=c("TextBox",{ Size=UDim2.new(1,-24,1,0),Position=UDim2.new(0,12,0,0), BackgroundTransparency=1, Text="arch://home", Font=Enum.Font.Gotham,TextSize=13, TextColor3=Color3.fromRGB(30,40,80), ClearTextOnFocus=false,ZIndex=z+3},addrRow) local page=c("ScrollingFrame",{ Size=UDim2.new(1,-16,1,-54), Position=UDim2.new(0,8,0,48), BackgroundColor3=Color3.new(1,1,1), BorderSizePixel=0, ScrollBarThickness=4, AutomaticCanvasSize=Enum.AutomaticSize.Y, CanvasSize=UDim2.new(0,0,0,0),ZIndex=z+2},bg) corner(page,8); stroke(page,T.border,1,.5) c("UIListLayout",{Padding=UDim.new(0,6)},page) pad(page,14) local pages={ ["arch://home"]={ {h=1, t="🏠 Arch Linux Browser"}, {h=0, t="Welcome to your Arch Linux system!"}, {h=2, t="Quick Links:"}, {lnk="arch://about"}, {lnk="arch://wiki"}, {lnk="arch://packages"}, {lnk="arch://community"}, }, ["arch://about"]={ {h=1, t="ℹ️ About Arch Linux"}, {h=0, t="Distribution: Arch Linux"}, {h=0, t="Architecture: x86_64"}, {h=0, t="Kernel: 6.6.2-arch1-1"}, {h=0, t="Init System: systemd"}, {h=0, t="Package Mgr: pacman"}, {h=0, t="Release: Rolling"}, {h=0, t="User: "..player.Name:lower()}, {h=0, t="Hostname: archos-roblox"}, {lnk="arch://home"}, }, ["arch://wiki"]={ {h=1, t="📚 ArchWiki"}, {h=0, t="The Arch Linux Wiki is the most comprehensive"}, {h=0, t="distribution wiki online. Documentation is"}, {h=0, t="written by users, for users."}, {h=2, t="Popular Articles:"}, {h=0, t="• Installation Guide"}, {h=0, t="• General Recommendations"}, {h=0, t="• List of Applications"}, {h=0, t="• Pacman Tips & Tricks"}, {h=0, t="• systemd Configuration"}, {h=2, t="Remember:"}, {h=0, t="RTFM — The wiki has your answer!"}, {lnk="arch://home"}, }, ["arch://packages"]={ {h=1, t="📦 Package Management"}, {h=2, t="Official Repositories:"}, {h=0, t="• core — Essential packages"}, {h=0, t="• extra — Additional packages"}, {h=0, t="• multilib — 32-bit packages"}, {h=2, t="Pacman Commands:"}, {h=0, t=" pacman -Syu Update system"}, {h=0, t=" pacman -S pkg Install package"}, {h=0, t=" pacman -R pkg Remove package"}, {h=0, t=" pacman -Ss query Search packages"}, {h=0, t=" pacman -Q List installed"}, {h=2, t="AUR — Arch User Repository:"}, {h=0, t="Community-maintained package repository"}, {h=0, t="Use AUR helpers like yay or paru"}, {lnk="arch://home"}, }, ["arch://community"]={ {h=1, t="👥 Arch Community"}, {h=0, t="Arch Linux is built by its community."}, {h=2, t="Get Involved:"}, {h=0, t="• Forums — https://bbs.archlinux.org"}, {h=0, t="• Reddit — r/archlinux"}, {h=0, t="• IRC — #archlinux on Libera.Chat"}, {h=0, t="• Bug Tracker — bugs.archlinux.org"}, {h=0, t="• Contribute — Submit packages to AUR"}, {h=2, t="Remember:"}, {h=0, t="Be helpful, follow the Code of Conduct,"}, {h=0, t="and always search before asking!"}, {lnk="arch://home"}, }, } local function render(url) for _,ch in ipairs(page:GetChildren()) do if ch:IsA("GuiObject") then ch:Destroy() end end local pg=pages[url] if not pg then c("TextLabel",{Size=UDim2.new(1,0,0,40),BackgroundTransparency=1, Text="404 — Page not found", Font=Enum.Font.GothamBold,TextSize=16, TextColor3=Color3.fromRGB(200,40,40), TextXAlignment=Enum.TextXAlignment.Left,ZIndex=z+3},page) return end for _,item in ipairs(pg) do if item.lnk then local b=c("TextButton",{ Size=UDim2.new(1,0,0,28), BackgroundColor3=Color3.fromRGB(230,240,255), Text="🔗 "..item.lnk, Font=Enum.Font.Gotham,TextSize=13, TextColor3=T.accent, TextXAlignment=Enum.TextXAlignment.Left, BorderSizePixel=0,ZIndex=z+3},page) corner(b,5); pad(b,6) b.MouseButton1Click:Connect(function() addrBox.Text=item.lnk; render(item.lnk) end) elseif item.h==1 then c("TextLabel",{Size=UDim2.new(1,0,0,0),AutomaticSize=Enum.AutomaticSize.Y, BackgroundTransparency=1,Text=item.t, Font=Enum.Font.GothamBold,TextSize=22, TextColor3=Color3.fromRGB(20,60,180), TextXAlignment=Enum.TextXAlignment.Left,TextWrapped=true,ZIndex=z+3},page) elseif item.h==2 then c("TextLabel",{Size=UDim2.new(1,0,0,0),AutomaticSize=Enum.AutomaticSize.Y, BackgroundTransparency=1,Text=item.t, Font=Enum.Font.GothamBold,TextSize=15, TextColor3=T.accent, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=z+3},page) else c("TextLabel",{Size=UDim2.new(1,0,0,0),AutomaticSize=Enum.AutomaticSize.Y, BackgroundTransparency=1,Text=item.t, Font=Enum.Font.Code,TextSize=13, TextColor3=Color3.fromRGB(30,40,70), TextXAlignment=Enum.TextXAlignment.Left,TextWrapped=true,ZIndex=z+3},page) end end end render("arch://home") addrBox.FocusLost:Connect(function(e) if e then render(addrBox.Text) end end) kspawn("firefox", 48) end -- ── FILE MANAGER ────────────────────────────────────────────── openFiles = function() if WINS["Files"] and WINS["Files"].Parent then WINS["Files"].Visible=true; return end local win,body,z = newWindow(" 📁 Thunar", 520, 440, 220, 100) local viewPath="/" local bg=c("Frame",{Size=UDim2.new(1,0,1,0),BackgroundColor3=T.surface, BorderSizePixel=0,ZIndex=z+1},body) local bread=c("Frame",{Size=UDim2.new(1,0,0,34), BackgroundColor3=T.surface2,BorderSizePixel=0,ZIndex=z+2},bg) local pathLbl=c("TextLabel",{ Size=UDim2.new(1,-8,1,0),Position=UDim2.new(0,8,0,0), BackgroundTransparency=1, Text="📂 /", Font=Enum.Font.Gotham,TextSize=12,TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=z+3},bread) local flist=c("ScrollingFrame",{ Size=UDim2.new(1,-16,1,-50), Position=UDim2.new(0,8,0,40), BackgroundTransparency=1,BorderSizePixel=0, ScrollBarThickness=3,ScrollBarImageColor3=T.accent, AutomaticCanvasSize=Enum.AutomaticSize.Y, CanvasSize=UDim2.new(0,0,0,0),ZIndex=z+2},bg) c("UIListLayout",{Padding=UDim.new(0,3)},flist) local function renderDir(path) viewPath=path; pathLbl.Text="📂 "..path for _,ch in ipairs(flist:GetChildren()) do if ch:IsA("GuiObject") then ch:Destroy() end end if path~="/" then local segs=path:split("/"); table.remove(segs) local par=table.concat(segs,"/"); if par=="" then par="/" end local upb=c("TextButton",{Size=UDim2.new(1,0,0,34), BackgroundColor3=T.surface2, Text="",BorderSizePixel=0,ZIndex=z+3},flist) corner(upb,6) c("TextLabel",{Size=UDim2.new(1,-10,1,0),Position=UDim2.new(0,10,0,0), BackgroundTransparency=1, Text="⬆ ..", Font=Enum.Font.Gotham,TextSize=13,TextColor3=T.accent2, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=z+4},upb) hover(upb,T.surface2,T.surface) upb.MouseButton1Click:Connect(function() renderDir(par) end) end local nd=FS[path] if not nd then return end for _,cp in ipairs(nd.children) do local child=FS[cp] if not child then continue end local segs=cp:split("/"); local nm=segs[#segs] local isDir=child.t=="dir" local row=c("TextButton",{Size=UDim2.new(1,0,0,34), BackgroundColor3=T.surface, Text="",BorderSizePixel=0,ZIndex=z+3},flist) corner(row,6); stroke(row,T.border,1,.6) hover(row,T.surface,T.surface2) c("TextLabel",{Size=UDim2.new(1,-10,1,0),Position=UDim2.new(0,10,0,0), BackgroundTransparency=1, Text=(isDir and "📁 " or "📄 ")..nm, Font=Enum.Font.Gotham,TextSize=13, TextColor3=isDir and T.accent2 or T.text, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=z+4},row) if not isDir then c("TextLabel",{Size=UDim2.new(0,70,1,0),Position=UDim2.new(1,-75,0,0), BackgroundTransparency=1, Text=#child.content.."B", Font=Enum.Font.Code,TextSize=11,TextColor3=T.textMut, ZIndex=z+4},row) end row.MouseButton1Click:Connect(function() if isDir then renderDir(cp) end end) end end renderDir("/") kspawn("thunar", 12) end -- ── CALCULATOR ─────────────────────────────────────────────── openCalc = function() if WINS["Calculator"] and WINS["Calculator"].Parent then WINS["Calculator"].Visible=true; return end local win,body,z = newWindow(" 🧮 Calculator", 280, 400, 300, 100) local bg=c("Frame",{Size=UDim2.new(1,0,1,0),BackgroundColor3=T.bg1, BorderSizePixel=0,ZIndex=z+1},body) local display=c("TextLabel",{ Size=UDim2.new(1,-16,0,70), Position=UDim2.new(0,8,0,8), BackgroundColor3=T.surface, Text="0", Font=Enum.Font.Code, TextSize=32, TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Right, ZIndex=z+2, BorderSizePixel=0},bg) corner(display,8); pad(display,12) local expr = "" local lastResult = "" local function updateDisplay() display.Text = (expr == "" and "0") or expr end local buttons = { {"C", "⌫", "%", "÷"}, {"7", "8", "9", "×"}, {"4", "5", "6", "-"}, {"1", "2", "3", "+"}, {"±", "0", ".", "="}, } local grid = c("Frame",{ Size=UDim2.new(1,-16,1,-96), Position=UDim2.new(0,8,0,86), BackgroundTransparency=1, ZIndex=z+1},bg) for ri, row in ipairs(buttons) do for ci, label in ipairs(row) do local isOp = (label == "÷" or label == "×" or label == "-" or label == "+" or label == "=") local isSpecial = (label == "C" or label == "⌫" or label == "%" or label == "±") local btnColor = isOp and T.accent or isSpecial and T.surface2 or T.surface local txtColor = isOp and Color3.new(1,1,1) or T.text local btn = c("TextButton",{ Size = UDim2.new(0.25, -6, 0.2, -6), Position = UDim2.new((ci-1)*0.25, 3, (ri-1)*0.2, 3), BackgroundColor3 = btnColor, Text = label, Font = Enum.Font.GothamBold, TextSize = 20, TextColor3 = txtColor, ZIndex = z+2, BorderSizePixel = 0, }, grid) corner(btn, 8) btn.MouseButton1Click:Connect(function() if label == "C" then expr = ""; updateDisplay() elseif label == "⌫" then expr = expr:sub(1, -2); updateDisplay() elseif label == "±" then if expr:sub(1,1) == "-" then expr = expr:sub(2) else expr = "-" .. expr end updateDisplay() elseif label == "=" then local eval = expr:gsub("×","*"):gsub("÷","/") local fn = loadstring("return " .. eval) if fn then local ok, result = pcall(fn) if ok then lastResult = tostring(result) display.Text = lastResult expr = lastResult else display.Text = "Error" expr = "" end else display.Text = "Error" expr = "" end else expr = expr .. label updateDisplay() end end) end end kspawn("gnome-calculator", 8) end -- ── SETTINGS ───────────────────────────────────────────────── openSettings = function() if WINS["Settings"] and WINS["Settings"].Parent then WINS["Settings"].Visible=true; return end local win,body,z = newWindow(" ⚙ Settings", 420, 380, 250, 100) local bg=c("Frame",{Size=UDim2.new(1,0,1,0),BackgroundColor3=T.surface, BorderSizePixel=0,ZIndex=z+1},body) c("TextLabel",{ Size=UDim2.new(1,-16,0,30), Position=UDim2.new(0,8,0,10), BackgroundTransparency=1, Text="🎨 Theme Selection", Font=Enum.Font.GothamBold, TextSize=16, TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+2},bg) local themeList = c("Frame",{ Size=UDim2.new(1,-16,0,280), Position=UDim2.new(0,8,0,48), BackgroundTransparency=1, ZIndex=z+1},bg) c("UIListLayout",{Padding=UDim.new(0,8)},themeList) local themeData = { {name="ArchLinux", desc="Pure Arch blue on black", icon="🏛️", preview={Color3.fromRGB(12,12,12), Color3.fromRGB(23,147,209)}}, {name="ArchClassic", desc="Classic terminal dark", icon="💻", preview={Color3.fromRGB(8,8,8), Color3.fromRGB(23,147,209)}}, {name="ArchMonokai", desc="Monokai Pro theme", icon="🎨", preview={Color3.fromRGB(39,40,34), Color3.fromRGB(102,217,239)}}, } for _, td in ipairs(themeData) do local row = c("Frame",{ Size=UDim2.new(1,0,0,75), BackgroundColor3=T.surface2, BorderSizePixel=0, ZIndex=z+2},themeList) corner(row,10); stroke(row, T.border, 1, .4) local preview = c("Frame",{ Size=UDim2.new(0,50,0,50), Position=UDim2.new(0,12,0.5,-25), BackgroundColor3=td.preview[1], BorderSizePixel=0, ZIndex=z+3},row) corner(preview,8); stroke(preview, td.preview[2], 2, 0) c("TextLabel",{ Size=UDim2.new(0,30,0,30), Position=UDim2.new(0,10,0,10), BackgroundTransparency=1, Text=td.icon, TextSize=24, ZIndex=z+4},preview) c("TextLabel",{ Size=UDim2.new(1,-160,0,22), Position=UDim2.new(0,74,0,12), BackgroundTransparency=1, Text=td.name, Font=Enum.Font.GothamBold, TextSize=16, TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+3},row) c("TextLabel",{ Size=UDim2.new(1,-160,0,18), Position=UDim2.new(0,74,0,36), BackgroundTransparency=1, Text=td.desc, Font=Enum.Font.Gotham, TextSize=12, TextColor3=T.textDim, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+3},row) local active = (ActiveTheme == td.name) local applyBtn = c("TextButton",{ Size=UDim2.new(0,80,0,30), Position=UDim2.new(1,-92,0.5,-15), BackgroundColor3=active and T.green or T.accentDk, Text=active and "✓ Active" or "Apply", TextColor3=Color3.new(1,1,1), Font=Enum.Font.GothamBold, TextSize=12, ZIndex=z+3, BorderSizePixel=0},row) corner(applyBtn,6) applyBtn.MouseButton1Click:Connect(function() if Themes[td.name] then ActiveTheme = td.name T = Themes[td.name] notify("Settings", "Theme '"..td.name.."' applied!\nRestart for full effect.", 5, "🎨") end end) end end -- ── SYSTEM MONITOR ───────────────────────────────────────────── openSysMonitor = function() if WINS["Monitor"] and WINS["Monitor"].Parent then WINS["Monitor"].Visible=true; return end local win,body,z = newWindow(" 📈 System Monitor", 400, 360, 280, 120) local bg=c("Frame",{Size=UDim2.new(1,0,1,0),BackgroundColor3=T.surface, BorderSizePixel=0,ZIndex=z+1},body) local labels = {} local info = { {lbl="OS:", key="os"}, {lbl="Kernel:", key="kern"}, {lbl="Architecture:", key="arch"}, {lbl="Uptime:", key="up"}, {lbl="Processes:", key="procs"}, {lbl="Memory:", key="ram"}, {lbl="User:", key="user"}, {lbl="Hostname:", key="host"}, {lbl="Shell:", key="shell"}, {lbl="Display:", key="display"}, } for i, item in ipairs(info) do c("TextLabel",{ Size=UDim2.new(0,120,0,26), Position=UDim2.new(0,12,0,10+(i-1)*30), BackgroundTransparency=1, Text=item.lbl, Font=Enum.Font.GothamBold, TextSize=13, TextColor3=T.accent2, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+2},bg) labels[item.key] = c("TextLabel",{ Size=UDim2.new(1,-140,0,26), Position=UDim2.new(0,135,0,10+(i-1)*30), BackgroundTransparency=1, Text="...", Font=Enum.Font.Code, TextSize=12, TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left, ZIndex=z+2},bg) end task.spawn(function() while win and win.Parent do local up = os.clock()-Kernel.boot local cnt=0; local mem=0 for _,p in pairs(Kernel.procs) do cnt+=1; mem+=p.mem end labels.os.Text = "Arch Linux" labels.kern.Text = "6.6.2-arch1-1" labels.arch.Text = "x86_64" labels.up.Text = string.format("%dd %dh %dm", math.floor(up/86400), math.floor((up%86400)/3600), math.floor((up%3600)/60)) labels.procs.Text = tostring(cnt) labels.ram.Text = string.format("%dM / 2048M (%d%%)", mem, math.floor(mem/2048*100)) labels.user.Text = player.Name:lower() labels.host.Text = "archos-roblox" labels.shell.Text = "bash 5.2.21" labels.display.Text = player.DisplayName task.wait(0.5) end end) kspawn("gnome-system-monitor", 14) end -- ── DESKTOP ICONS ────────────────────────────────────────────── local ICONS={ {lbl="Terminal", ico="⌨", fn=openTerminal, pos=UDim2.new(0,18,0,18)}, {lbl="Editor", ico="📝", fn=openNotepad, pos=UDim2.new(0,18,0,112)}, {lbl="htop", ico="📊", fn=openTaskManager, pos=UDim2.new(0,18,0,206)}, {lbl="Firefox", ico="🌐", fn=openBrowser, pos=UDim2.new(0,18,0,300)}, {lbl="Thunar", ico="📁", fn=openFiles, pos=UDim2.new(0,18,0,394)}, {lbl="Calc", ico="🧮",fn=openCalc, pos=UDim2.new(0,110,0,18)}, {lbl="Settings", ico="⚙", fn=openSettings, pos=UDim2.new(0,110,0,112)}, {lbl="Monitor", ico="📈", fn=openSysMonitor, pos=UDim2.new(0,110,0,206)}, } for _,ic in ipairs(ICONS) do local fr=c("Frame",{ Size=UDim2.new(0,76,0,82), Position=ic.pos, BackgroundColor3=T.surface, BackgroundTransparency=0.3, BorderSizePixel=0,ZIndex=2},desktop) corner(fr,10); stroke(fr,T.border,1,.4) c("TextLabel",{Size=UDim2.new(1,0,0,48),Position=UDim2.new(0,0,0,4), BackgroundTransparency=1,Text=ic.ico, Font=Enum.Font.GothamBold,TextSize=30,ZIndex=3},fr) c("TextLabel",{Size=UDim2.new(1,-4,0,26),Position=UDim2.new(0,2,0,50), BackgroundTransparency=1,Text=ic.lbl, Font=Enum.Font.Gotham,TextSize=10,TextColor3=T.text, TextWrapped=true,ZIndex=3},fr) local btn=c("TextButton",{Size=UDim2.new(1,0,1,0),BackgroundTransparency=1, Text="",ZIndex=4},fr) btn.MouseEnter:Connect(function() tw(fr,{BackgroundTransparency=0.1, BackgroundColor3=T.surface2}) end) btn.MouseLeave:Connect(function() tw(fr,{BackgroundTransparency=0.3, BackgroundColor3=T.surface}) end) btn.MouseButton1Click:Connect(ic.fn) end -- ── TASKBAR ─────────────────────────────────────────────────── local taskbar=c("Frame",{ Size=UDim2.new(1,0,0,44), Position=UDim2.new(0,0,1,-44), BackgroundColor3=T.bg1, BorderSizePixel=0,ZIndex=50},gui) c("Frame",{Size=UDim2.new(1,0,0,1), BackgroundColor3=T.accent,BackgroundTransparency=0.6, BorderSizePixel=0,ZIndex=51},taskbar) local startBtn=c("TextButton",{ Size=UDim2.new(0,100,0,32), Position=UDim2.new(0,6,0.5,-16), BackgroundColor3=T.accentDk, Text="🏛 Arch", TextColor3=Color3.new(1,1,1), Font=Enum.Font.GothamBold,TextSize=14, ZIndex=51,BorderSizePixel=0},taskbar) corner(startBtn,6) local taskWinArea = c("Frame",{ Size=UDim2.new(0,520,0,32), Position=UDim2.new(0,116,0.5,-16), BackgroundTransparency=1, ZIndex=51},taskbar) c("UIListLayout",{ FillDirection=Enum.FillDirection.Horizontal, Padding=UDim.new(0,4), },taskWinArea) refreshTaskbar = function() for _,ch in ipairs(taskWinArea:GetChildren()) do if ch:IsA("TextButton") then ch:Destroy() end end for title, _ in pairs(OpenWinNames) do if WINS[title] and WINS[title].Parent then local short = title:gsub("^%s+",""):sub(1,14) local tb = c("TextButton",{ Size=UDim2.new(0,100,1,0), BackgroundColor3=T.surface2, Text=short, TextColor3=T.text, Font=Enum.Font.Gotham, TextSize=11, ZIndex=52, BorderSizePixel=0, },taskWinArea) corner(tb,5) hover(tb, T.surface2, T.surface) tb.MouseButton1Click:Connect(function() local w = WINS[title] if w then w.Visible=true; Z+=1; w.ZIndex=Z end end) end end end -- Clock local clockFrame=c("Frame",{ Size=UDim2.new(0,90,1,0), Position=UDim2.new(1,-96,0,0), BackgroundTransparency=1,ZIndex=51},taskbar) local clockMain=c("TextLabel",{ Size=UDim2.new(1,0,0,22),Position=UDim2.new(0,0,0,4), BackgroundTransparency=1, Text=os.date("%H:%M"), Font=Enum.Font.GothamBold,TextSize=16,TextColor3=T.text, ZIndex=52},clockFrame) local clockDate=c("TextLabel",{ Size=UDim2.new(1,0,0,14),Position=UDim2.new(0,0,0,24), BackgroundTransparency=1, Text=os.date("%m/%d/%Y"), Font=Enum.Font.Gotham,TextSize=11,TextColor3=T.textDim, ZIndex=52},clockFrame) task.spawn(function() while gui and gui.Parent do task.wait(1) clockMain.Text=os.date("%H:%M") clockDate.Text=os.date("%m/%d/%Y") end end) -- Logo c("TextLabel",{ Size=UDim2.new(0,80,1,0), Position=UDim2.new(0.5,-40,0,0), BackgroundTransparency=1, Text="Arch Linux", Font=Enum.Font.GothamBold,TextSize=12,TextColor3=T.textMut, ZIndex=51},taskbar) -- ── START MENU ───────────────────────────────────────────────── local smOpen=false local sm=c("Frame",{ Size=UDim2.new(0,300,0,480), Position=UDim2.new(0,-310,1,-44), BackgroundColor3=T.bg2, BorderSizePixel=0,ZIndex=60, Visible=false},gui) corner(sm,12); stroke(sm,T.accent,1,.4) local smHead=c("Frame",{ Size=UDim2.new(1,0,0,80), BackgroundColor3=T.accentDk, BorderSizePixel=0,ZIndex=61},sm) corner(smHead,12) c("Frame",{Size=UDim2.new(1,0,0.5,0),Position=UDim2.new(0,0,0.5,0), BackgroundColor3=T.accentDk,BorderSizePixel=0,ZIndex=61},smHead) c("TextLabel",{ Size=UDim2.new(1,-12,0,32),Position=UDim2.new(0,12,0,12), BackgroundTransparency=1, Text="🏛 Arch Linux", Font=Enum.Font.GothamBold,TextSize=18,TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=62},smHead) c("TextLabel",{ Size=UDim2.new(1,-12,0,18),Position=UDim2.new(0,12,0,46), BackgroundTransparency=1, Text=player.Name:lower().."@archos", Font=Enum.Font.Code,TextSize=13,TextColor3=Color3.fromRGB(180,210,255), TextXAlignment=Enum.TextXAlignment.Left,ZIndex=62},smHead) local smApps={ {ico="⌨", lbl="Terminal", fn=openTerminal}, {ico="📝", lbl="Text Editor", fn=openNotepad}, {ico="📊", lbl="htop", fn=openTaskManager}, {ico="🌐", lbl="Firefox", fn=openBrowser}, {ico="📁", lbl="Thunar", fn=openFiles}, {ico="🧮", lbl="Calculator", fn=openCalc}, {ico="⚙", lbl="Settings", fn=openSettings}, {ico="📈", lbl="System Monitor", fn=openSysMonitor}, } local smList=c("Frame",{ Size=UDim2.new(1,-12,0,310), Position=UDim2.new(0,6,0,86), BackgroundTransparency=1,ZIndex=61},sm) c("UIListLayout",{Padding=UDim.new(0,3)},smList) for _,app in ipairs(smApps) do local row=c("TextButton",{ Size=UDim2.new(1,0,0,34), BackgroundColor3=T.bg2, Text="",BorderSizePixel=0,ZIndex=62},smList) corner(row,7); hover(row,T.bg2,T.surface) c("TextLabel",{Size=UDim2.new(0,36,1,0),Position=UDim2.new(0,8,0,0), BackgroundTransparency=1,Text=app.ico, Font=Enum.Font.GothamBold,TextSize=18,ZIndex=63},row) c("TextLabel",{Size=UDim2.new(1,-50,1,0),Position=UDim2.new(0,46,0,0), BackgroundTransparency=1,Text=app.lbl, Font=Enum.Font.Gotham,TextSize=13,TextColor3=T.text, TextXAlignment=Enum.TextXAlignment.Left,ZIndex=63},row) row.MouseButton1Click:Connect(function() smOpen=false tw(sm,{Position=UDim2.new(0,-310,1,-44)},.2) task.delay(.21,function() sm.Visible=false end) app.fn() end) end -- Separator c("Frame",{Size=UDim2.new(1,-12,0,1),Position=UDim2.new(0,6,0,405), BackgroundColor3=T.border,BackgroundTransparency=.4, BorderSizePixel=0,ZIndex=61},sm) -- Power button local shutBtn=c("TextButton",{ Size=UDim2.new(1,-12,0,45), Position=UDim2.new(0,6,0,414), BackgroundColor3=Color3.fromRGB(180,40,40), Text="⏻ Shutdown", TextColor3=Color3.new(1,1,1), Font=Enum.Font.GothamBold,TextSize=14, ZIndex=62,BorderSizePixel=0},sm) corner(shutBtn,7) hover(shutBtn,Color3.fromRGB(180,40,40),Color3.fromRGB(220,50,50)) shutBtn.MouseButton1Click:Connect(function() smOpen=false; sm.Visible=false local ov=c("Frame",{ Size=UDim2.new(1,0,1,0), BackgroundColor3=Color3.new(0,0,0), BackgroundTransparency=1, ZIndex=9999},gui) tw(ov,{BackgroundTransparency=0},1) task.delay(1,function() c("TextLabel",{ Size=UDim2.new(1,0,0,60),Position=UDim2.new(0,0,0.40,0), BackgroundTransparency=1, Text="Arch Linux", Font=Enum.Font.GothamBold,TextSize=28, TextColor3=T.accent,ZIndex=10000},ov) c("TextLabel",{ Size=UDim2.new(1,0,0,40),Position=UDim2.new(0,0,0.48,0), BackgroundTransparency=1, Text="System Shutdown", Font=Enum.Font.Gotham,TextSize=18, TextColor3=T.text,ZIndex=10000},ov) c("TextLabel",{ Size=UDim2.new(1,0,0,30),Position=UDim2.new(0,0,0.56,0), BackgroundTransparency=1, Text="I use Arch btw.", Font=Enum.Font.Gotham,TextSize=14, TextColor3=T.textDim,ZIndex=10000},ov) end) task.delay(4,function() gui:Destroy() end) end) -- Start menu logic local function toggleSM() smOpen=not smOpen if smOpen then sm.Visible=true sm.Position=UDim2.new(0,-310,1,-44) tw(sm,{Position=UDim2.new(0,6,1,-sm.Size.Y.Offset-44)},.22,Enum.EasingStyle.Back) else tw(sm,{Position=UDim2.new(0,-310,1,-44)},.18) task.delay(.2,function() sm.Visible=false end) end end startBtn.MouseButton1Click:Connect(toggleSM) hover(startBtn, T.accentDk, T.accent) desktop.InputBegan:Connect(function(i) if smOpen and i.UserInputType==Enum.UserInputType.MouseButton1 then smOpen=false tw(sm,{Position=UDim2.new(0,-310,1,-44)},.18) task.delay(.2,function() sm.Visible=false end) end end) -- ── ARCH INSTALLER (archinstall) ────────────────────────────── local INSTALL_CONFIG = { keyboard = "us", locale = "en_US.UTF-8", timezone = "UTC", hostname = "archos", username = player.Name:lower(), profile = "desktop", theme = "ArchLinux", } local function runInstaller() local installer = c("Frame", { Size = UDim2.new(1, 0, 1, 0), BackgroundColor3 = Color3.fromRGB(0, 0, 0), ZIndex = 10000, }, gui) -- Terminal-style installer local installScroll = c("ScrollingFrame", { Size = UDim2.new(1, -40, 1, -40), Position = UDim2.new(0, 20, 0, 20), BackgroundColor3 = Color3.fromRGB(10, 10, 15), BorderSizePixel = 0, ScrollBarThickness = 4, ScrollBarImageColor3 = Color3.fromRGB(137, 180, 250), AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(0, 0, 0, 0), ZIndex = 10001, }, installer) c("UIListLayout", {Padding = UDim.new(0, 2)}, installScroll) pad(installScroll, 12) local function iout(txt, col) local lbl = c("TextLabel", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Text = txt, Font = Enum.Font.Code, TextSize = 13, TextColor3 = col or Color3.fromRGB(205, 214, 244), TextXAlignment = Enum.TextXAlignment.Left, TextWrapped = true, ZIndex = 10002, }, installScroll) task.defer(function() installScroll.CanvasPosition = Vector2.new(0, installScroll.AbsoluteCanvasSize.Y) end) return lbl end -- Installation menu local currentStep = 1 local steps = { {name = "Keyboard layout", key = "keyboard", options = {"us", "uk", "de", "fr", "es"}}, {name = "Locale", key = "locale", options = {"en_US.UTF-8", "en_GB.UTF-8", "de_DE.UTF-8"}}, {name = "Timezone", key = "timezone", options = {"UTC", "America/New_York", "Europe/London", "Asia/Tokyo"}}, {name = "Hostname", key = "hostname", custom = true}, {name = "Desktop profile", key = "profile", options = {"minimal", "desktop", "xfce", "kde"}}, {name = "Theme", key = "theme", options = {"ArchLinux", "ArchClassic", "ArchMonokai"}}, } local menuActive = true local selectedOption = 1 local function drawMenu() for _, ch in ipairs(installScroll:GetChildren()) do if ch:IsA("TextLabel") then ch:Destroy() end end iout("", Color3.fromRGB(23, 147, 209)) iout(" -` ", Color3.fromRGB(23, 147, 209)) iout(" .o+` ", Color3.fromRGB(23, 147, 209)) iout(" `ooo/ ", Color3.fromRGB(23, 147, 209)) iout(" `+oooo: ", Color3.fromRGB(23, 147, 209)) iout(" `+oooooo: ", Color3.fromRGB(23, 147, 209)) iout(" -+oooooo+: ", Color3.fromRGB(23, 147, 209)) iout(" `/:-:++oooo+: ", Color3.fromRGB(23, 147, 209)) iout(" `/++++/+++++++: ", Color3.fromRGB(23, 147, 209)) iout(" `/++++++++++++++: ", Color3.fromRGB(23, 147, 209)) iout(" `/+++ooooooooooooo/` ", Color3.fromRGB(23, 147, 209)) iout(" ./ooosssso++osssssso+` ", Color3.fromRGB(23, 147, 209)) iout(" .oossssso-````/ossssss+` ", Color3.fromRGB(23, 147, 209)) iout(" -osssssso. :ssssssso. ", Color3.fromRGB(23, 147, 209)) iout(" :osssssss/ osssso+++. ", Color3.fromRGB(23, 147, 209)) iout(" /ossssssss/ +ssssooo/- ", Color3.fromRGB(23, 147, 209)) iout(" `/ossssso+/:- -:/+osssso+- ", Color3.fromRGB(23, 147, 209)) iout(" `+sso+:-` `.-/+oso: ", Color3.fromRGB(23, 147, 209)) iout(" `++:. `-/+/ ", Color3.fromRGB(23, 147, 209)) iout(" .` `/ ", Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(23, 147, 209)) iout("╔═══════════════════════════════════════════════════════╗", Color3.fromRGB(23, 147, 209)) iout("║ ║", Color3.fromRGB(23, 147, 209)) iout("║ ARCH LINUX INSTALLER ║", Color3.fromRGB(255, 255, 255)) iout("║ (archinstall) ║", Color3.fromRGB(255, 255, 255)) iout("║ ║", Color3.fromRGB(23, 147, 209)) iout("╚═══════════════════════════════════════════════════════╝", Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) iout("Use ↑/↓ arrows to navigate, ENTER to select, ESC to skip", Color3.fromRGB(180, 180, 180)) iout("", Color3.fromRGB(255, 255, 255)) if currentStep <= #steps then local step = steps[currentStep] iout(">>> " .. step.name, Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) if step.custom then iout("Current: " .. INSTALL_CONFIG[step.key], Color3.fromRGB(0, 255, 0)) iout("[Press ENTER to keep current value]", Color3.fromRGB(100, 100, 100)) else for i, opt in ipairs(step.options) do local prefix = (i == selectedOption) and " → " or " " local color = (i == selectedOption) and Color3.fromRGB(23, 147, 209) or Color3.fromRGB(180, 180, 180) iout(prefix .. opt, color) end end else iout("╔═══════════════════════════════════════════════════════╗", Color3.fromRGB(23, 147, 209)) iout("║ INSTALLATION SUMMARY ║", Color3.fromRGB(255, 255, 255)) iout("╚═══════════════════════════════════════════════════════╝", Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) iout("Keyboard: " .. INSTALL_CONFIG.keyboard, Color3.fromRGB(0, 255, 0)) iout("Locale: " .. INSTALL_CONFIG.locale, Color3.fromRGB(0, 255, 0)) iout("Timezone: " .. INSTALL_CONFIG.timezone, Color3.fromRGB(0, 255, 0)) iout("Hostname: " .. INSTALL_CONFIG.hostname, Color3.fromRGB(0, 255, 0)) iout("Profile: " .. INSTALL_CONFIG.profile, Color3.fromRGB(0, 255, 0)) iout("Theme: " .. INSTALL_CONFIG.theme, Color3.fromRGB(0, 255, 0)) iout("", Color3.fromRGB(255, 255, 255)) iout(" → Press ENTER to begin installation", Color3.fromRGB(23, 147, 209)) end end drawMenu() local inputConn inputConn = UIS.InputBegan:Connect(function(input, gpe) if gpe or not menuActive then return end if currentStep <= #steps then local step = steps[currentStep] if input.KeyCode == Enum.KeyCode.Up then if not step.custom then selectedOption = math.max(1, selectedOption - 1) drawMenu() end elseif input.KeyCode == Enum.KeyCode.Down then if not step.custom then selectedOption = math.min(#step.options, selectedOption + 1) drawMenu() end elseif input.KeyCode == Enum.KeyCode.Return then if not step.custom then INSTALL_CONFIG[step.key] = step.options[selectedOption] end currentStep += 1 selectedOption = 1 drawMenu() elseif input.KeyCode == Enum.KeyCode.Escape then currentStep += 1 selectedOption = 1 drawMenu() end else if input.KeyCode == Enum.KeyCode.Return then menuActive = false inputConn:Disconnect() -- Apply selected theme if Themes[INSTALL_CONFIG.theme] then T = Themes[INSTALL_CONFIG.theme] ActiveTheme = INSTALL_CONFIG.theme end -- Run installation for _, ch in ipairs(installScroll:GetChildren()) do if ch:IsA("TextLabel") then ch:Destroy() end end iout("", Color3.fromRGB(23, 147, 209)) iout("╔═══════════════════════════════════════════════════════╗", Color3.fromRGB(23, 147, 209)) iout("║ STARTING INSTALLATION... ║", Color3.fromRGB(255, 255, 255)) iout("╚═══════════════════════════════════════════════════════╝", Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) local installSteps = { "[1/12] Partitioning disk...", "[2/12] Formatting partitions...", "[3/12] Mounting file systems...", "[4/12] Installing base system...", "[5/12] Installing kernel...", "[6/12] Configuring locale (" .. INSTALL_CONFIG.locale .. ")...", "[7/12] Setting timezone (" .. INSTALL_CONFIG.timezone .. ")...", "[8/12] Setting hostname (" .. INSTALL_CONFIG.hostname .. ")...", "[9/12] Installing " .. INSTALL_CONFIG.profile .. " profile...", "[10/12] Configuring bootloader...", "[11/12] Applying " .. INSTALL_CONFIG.theme .. " theme...", "[12/12] Finalizing installation...", } task.spawn(function() for i, step in ipairs(installSteps) do iout(step, Color3.fromRGB(0, 255, 0)) -- Progress bar local pct = math.floor((i / #installSteps) * 100) local barFilled = math.floor(pct / 2) local bar = "["..string.rep("█", barFilled)..string.rep("░", 50 - barFilled).."] "..pct.."%" iout(bar, Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) task.wait(math.random(30, 80) / 100) end task.wait(0.5) iout("╔═══════════════════════════════════════════════════════╗", Color3.fromRGB(0, 255, 0)) iout("║ INSTALLATION COMPLETE! ║", Color3.fromRGB(0, 255, 0)) iout("╚═══════════════════════════════════════════════════════╝", Color3.fromRGB(0, 255, 0)) iout("", Color3.fromRGB(255, 255, 255)) iout("Arch Linux has been successfully installed.", Color3.fromRGB(23, 147, 209)) iout("Your system will now boot...", Color3.fromRGB(23, 147, 209)) iout("", Color3.fromRGB(255, 255, 255)) iout("Welcome to Arch Linux. I use Arch btw.", Color3.fromRGB(255, 255, 0)) task.wait(2) -- Fade out installer local function fadeOut(obj) if obj:IsA("TextLabel") or obj:IsA("Frame") then tw(obj, {BackgroundTransparency = 1}, 0.5) end if obj:IsA("TextLabel") then tw(obj, {TextTransparency = 1}, 0.5) end for _, ch in ipairs(obj:GetChildren()) do fadeOut(ch) end end fadeOut(installer) task.wait(0.6) installer:Destroy() -- Start boot sequence runBootSequence() end) end end end) end -- ── BOOT SCREEN ───────────────────────────────────────────── function runBootSequence() local boot=c("Frame",{ Size=UDim2.new(1,0,1,0), BackgroundColor3=Color3.fromRGB(0,0,0), ZIndex=9000},gui) local bootLogo=c("TextLabel",{ Size=UDim2.new(1,0,0,100), Position=UDim2.new(0,0,0.32,0), BackgroundTransparency=1, Text="Arch Linux", Font=Enum.Font.GothamBold,TextSize=64, TextColor3=T.accent,ZIndex=9001},boot) local bootSub=c("TextLabel",{ Size=UDim2.new(1,0,0,28), Position=UDim2.new(0,0,0.32,100), BackgroundTransparency=1, Text="v3.0 — I use Arch btw", Font=Enum.Font.Gotham,TextSize=18, TextColor3=T.textDim,ZIndex=9001},boot) local pbBg=c("Frame",{ Size=UDim2.new(0,400,0,4), Position=UDim2.new(0.5,-200,0.70,0), BackgroundColor3=T.surface2, BorderSizePixel=0,ZIndex=9001},boot) corner(pbBg,2) local pbFill=c("Frame",{ Size=UDim2.new(0,0,1,0), BackgroundColor3=T.accent, BorderSizePixel=0,ZIndex=9002},pbBg) corner(pbFill,2) local pbStatus=c("TextLabel",{ Size=UDim2.new(0,400,0,22), Position=UDim2.new(0.5,-200,0.70,12), BackgroundTransparency=1, Text="Loading...", Font=Enum.Font.Code,TextSize=13, TextColor3=T.textDim,ZIndex=9001},boot) local steps={ {t="[ 0.000000] Booting Linux 6.6.2-arch1-1...", p=0.10}, {t="[ 0.123456] Initializing kernel modules...", p=0.22}, {t="[ 0.245678] Mounting file systems...", p=0.34}, {t="[ 0.367890] Starting systemd...", p=0.46}, {t="[ 0.489012] Loading user profile...", p=0.58}, {t="[ 0.610234] Applying theme: "..ActiveTheme.."...", p=0.70}, {t="[ 0.732456] Starting window manager...", p=0.82}, {t="[ 0.854678] System ready. Welcome to Arch!", p=1.00}, } task.spawn(function() for _,s in ipairs(steps) do pbStatus.Text=s.t tw(pbFill,{Size=UDim2.new(s.p,0,1,0)},.35) task.wait(.32) end task.wait(.4) local function fadeOut(obj) if obj:IsA("TextLabel") then tw(obj,{TextTransparency=1},.5) end if obj:IsA("Frame") or obj:IsA("TextLabel") then tw(obj,{BackgroundTransparency=1},.5) end for _,ch in ipairs(obj:GetChildren()) do fadeOut(ch) end end fadeOut(bootLogo); fadeOut(bootSub) fadeOut(pbBg); fadeOut(pbStatus) task.wait(.3) tw(boot,{BackgroundTransparency=1},.5) task.wait(.55) boot:Destroy() task.delay(0.5, function() notify("Welcome!", "Arch Linux loaded successfully.\n"..player.DisplayName..", I use Arch btw.", 6, "🏛️") end) end) end -- ── START INSTALLATION ───────────────────────────────────────── -- Run the installer first, which will then boot the OS runInstaller()