Linux_util: My All-in-One Linux Setup & Utilities Installer

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 timedatectl syntax 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. :penguin: