If you’ve ever set up a fresh Linux install — whether it’s a new workstation, a homelab VM, or a physical machine after a reinstall — you know the drill. Update packages, install your tools, configure your shell, add your repos, mount your shares… and somewhere along the way you forget something and spend 20 minutes figuring out why Docker isn’t in your group yet.
I’ve been there more times than I can count. So I built linux_util — an interactive, multi-distribution Bash utility that handles all of it in one place.
What Is linux_util?
linux_util is a Bash-based tool with two modes: an interactive terminal UI (TUI) for hands-on use, and a full CLI for scripting and automation. It supports 100+ utilities organized into categories, works across all major Linux distributions, and handles install, uninstall, and update operations — all with automatic system snapshots before any changes are made.
The Interactive TUI
The centerpiece of linux_util is its two-panel TUI. On the left you have a category/profile sidebar along with live system info (hostname, OS, kernel, CPU, RAM, disk, uptime). On the right is the item list with a description pane at the bottom.
┌──────────────────────┬─────────────────────────────────────────────────┐
│ linux_util (main: a1b2c3) / search │
├──────────────────────┼─────────────────────────────────────────────────┤
│ CATEGORIES │ Internet ────────────────────────────────────── │
├──────────────────────┤ [D] Email Clients │
│ > System Tasks │ [D] Messaging │
│ Development │ [D] Remote Access │
│ Gaming │ [D] VPN │
│ Internet │ [D] Web Browsers │
│ Productivity │ [x] QBittorrent (v4.6.4) │
│ System Tools │ [ ] Syncthing (v1.27.6) │
├──────────────────────┤ │
│ PROFILES │ │
├──────────────────────┤ │
│ Run Me First │ │
│ Default VM Server │ │
│ Default Phys. PC │ │
│ Developer Workstat. │ │
│ Home Desktop │ │
├──────────────────────┤ │
│ SYSTEM Details │ │
├──────────────────────┤ │
│ Host: linux-pc │ │
│ OS: Arch Linux │ │
│ Kernel: 6.12.8-1 │──────────────────────────────────────────────── │
│ CPU: i9-14900K │ Open-source BitTorrent client with a clean │
│ Mem: 8.2G/32G │ interface and no ads. │
│ Disk: 245G/500G │ │
│ Uptime: 3d 12h │ │
├──────────────────────┴─────────────────────────────────────────────────┤
│ Actions: Install: 0 | Uninstall: 1 | Update: 0 │
│ [^v] Navigate [Space] Select [U] Update [/] Search [Enter] Confirm │
└────────────────────────────────────────────────────────────────────────┘
Navigation is keyboard-driven — arrow keys to move, Space to toggle a selection, U to queue an update, / to search across all categories, and Enter to confirm or drill into a subcategory. The action bar at the bottom always shows you exactly what’s queued before you commit.
100+ Utilities, Organized by Category
Everything is grouped into logical categories so you’re not scrolling through a wall of options.
System Tasks
Beyond just installing software, linux_util handles common system configuration tasks:
- Full System Upgrade — refreshes all package managers, runs a full upgrade, and cleans cache
- Mount NFS / SMB Share — interactively discovers remote exports or SMB servers, stores credentials securely, and persists the mount in
/etc/fstab - UFW Firewall — installs and configures Uncomplicated Firewall with sensible defaults
- Enable RDP — sets up XRDP for remote desktop access
- Flatpak Setup — configures Flatpak and adds the Flathub repo
- Local Time Zone / Locale — interactive wizard so you never have to remember
timedatectlsyntax again
Development
A solid toolkit for anyone doing hands-on technical work: Docker, VS Code, GitHub CLI, Node.js (via NodeSource LTS), NVM, pyenv, Rustup, Go SDK, Ansible, Terraform, OpenTofu, Podman, kubectl, k9s, DBeaver, Postman, Neovim, JetBrains Toolbox, Cursor IDE, Virt-Manager, and more.
Internet & Remote Access
Browsers (Brave, Firefox, Chrome, LibreWolf, Thorium, Vivaldi), VPNs (Tailscale, WireGuard, ProtonVPN, PIA), remote desktop tools (Remmina, AnyDesk, RustDesk, Devolutions RDM), messaging (Signal, Discord, Telegram, Slack, Element), and SSH (OpenSSH Server, Termius).
Productivity
The essentials: LibreOffice, GIMP, Inkscape, OBS Studio, Kdenlive, Obsidian, Joplin, Bitwarden, VLC, Nextcloud Desktop, Flameshot, and more.
System Tools
Btop, Fastfetch, Zsh + Oh My Zsh, ClamAV, Ventoy, Stacer, Input Leap, and Filelight.
Gaming
Steam, Lutris, Heroic Games Launcher, Bottles, Wine, Proton-GE via ProtonUp-Qt, MangoHud, and Feral Gamemode.
Drivers
AMD and NVIDIA driver installers, Intel microcode, LACT for AMD GPU tuning, and XCP-ng/XEN Guest Utilities (a personal one — I run XCP-ng in my homelab).
Desktop Environments
For those who want to switch it up — GNOME, KDE Plasma, Xfce, Cinnamon, MATE, LXQt, Budgie, Deepin, Pantheon, and even the new COSMIC desktop from System76.
Installation Profiles
One of my favorite features is Profiles — curated presets that pre-populate your install queue in one shot. There are five built-in profiles:
| Profile | What It Installs |
|---|---|
| Run Me First | Timeshift only — get a restore point before anything else |
| Default VM Server | Xen Guest Utilities, Btop, Zsh + Oh My Zsh |
| Default Physical PC | VSCode, GitHub CLI, Steam, Brave, and more |
| Developer Workstation | UFW, OpenSSH, Docker, VSCode, GitHub CLI, NVM, Postman, DBeaver, Bitwarden, Btop, Zsh, Fastfetch |
| Home Desktop | Firefox, Thunderbird, Signal, LibreOffice, GIMP, Nextcloud, Bitwarden, Joplin, QBittorrent, ProtonVPN, Btop, Zsh, Fastfetch |
Profiles are fully customizable in lib/profiles.sh, and items already installed are automatically skipped.
Automatic Snapshots
Before every install, uninstall, or update operation, linux_util automatically takes a system snapshot — tagged with the operation name (e.g., linux_util: Install Docker). It supports both Timeshift (all distros) and Snapper (Arch-based systems like CachyOS). If snapshot creation fails for any reason, the operation continues normally — it’s non-blocking.
CLI Mode for Automation
Don’t want the TUI? The script is fully usable non-interactively:
bash
./linux_util.sh --list # list all utilities with install status
./linux_util.sh --check "Docker" # exit 0 if installed, 1 if not
./linux_util.sh --install "Visual Studio Code"
./linux_util.sh --dry-run --update-all # preview without making changes
Utility names are matched case-insensitively and support partial matching, so --install docker works just as well as --install "Docker". --dry-run can be combined with any action flag, which is great for testing before running in a provisioning script.
Cross-Distribution Support
linux_util detects your distro automatically and uses the right package manager:
| Family | Distributions | Package Manager |
|---|---|---|
| Debian/Ubuntu | Ubuntu, Debian, Mint, Pop!_OS, elementary OS, Zorin, Kali, KDE Neon | apt |
| Fedora | Fedora | dnf |
| RHEL | RHEL, CentOS, Rocky, AlmaLinux, Oracle Linux | dnf / yum |
| Arch | Arch, Manjaro, EndeavourOS, Garuda, CachyOS, Artix | pacman + AUR |
| openSUSE | Leap, Tumbleweed, SLES | zypper |
Unrecognized distros are matched via ID_LIKE in /etc/os-release, then by auto-detecting the available package manager as a fallback.
Getting Started
bash
git clone https://github.com/acebmxer/linux_util.git
cd linux_util
chmod +x linux_util.sh
./linux_util.sh
That’s it. No Python, no Node — just Bash 4.0+ and sudo access.
If you want to kick the tires without making any changes, run --dry-run first:
bash
./linux_util.sh --dry-run --install "Docker"
Tab completion is also available for both bash and zsh via the completions/ directory.
What’s Next
linux_util is something I actively use and maintain as my homelab and daily driver needs evolve. If you find it useful, have a utility you’d like to see added, or run into something broken on your distro, feel free to open an issue or contribute on GitHub.
Happy homelabbing. ![]()