Shell Bling Ubuntu

May 23, 2026 ยท View on GitHub

A curated set of command-line niceties for a fresh Ubuntu, Debian, Fedora, or macOS install. One command, sudo password once, fzf picker at the end.

๐Ÿ“„ Landing page: https://hiandrewquinn.github.io/shell-bling-ubuntu/

Quickstart

wget -qO- https://raw.githubusercontent.com/hiAndrewQuinn/shell-bling-ubuntu/main/install.sh | sh

wget is preferred because it ships in more base images than curl does โ€” fresh Debian 13, for example, has wget but not curl. If you already have curl, you can use that instead:

curl -fsSL https://raw.githubusercontent.com/hiAndrewQuinn/shell-bling-ubuntu/main/install.sh | sh

Either way the script installs curl itself before it needs to fetch anything else, so they're equivalent once it's running.

That's it. The script will:

  1. Detect your platform.
  2. Ask for your sudo password once (and keep the timestamp alive in the background).
  3. Install everything silently.
  4. Open one fzf picker for your default editor (nvim / vim / hx / micro). fish becomes your login shell automatically.
  5. Print a friendly recap.

Log out of your desktop session and back in (or reboot) when it finishes โ€” that's how $SHELL and the new x-terminal-emulator default actually take effect. Just reopening a terminal usually isn't enough.

Philosophy: zero configuration files

Shell Bling never drops a dotfile in your home directory. No .vimrc, no .tmux.conf, no opinionated config.fish. The one exception is the optional LazyVim starter, which is its own scaffolded thing you can ignore or replace.

Where possible we ship zero-config tools that just work โ€” fzf, starship, zoxide, bat, eza, lsd, helix, micro. Where there's a real choice to make, we ship multiple variants side-by-side and let you pick: nvim / vim / hx / micro for editors, lsd + eza for modern ls, xclip + wl-clipboard for the X11/Wayland split. You configure your shell on your own time, in your own way.

Supported platforms

Shell Bling runs in a Docker matrix of 30 distros across 7 package-manager families on every change. Today the matrix is amd64-only; arm64 coverage is in flight. macOS is supported (via Homebrew) but not Docker-tested.

Tier 1 โ€” fully supported

All 23 tools install at pinned version. Smoke test PASS without softening.

Testing: โœ“ Docker matrix ยท โœ“ automated VM matrix ยท โœ“ manual VM end-to-end

DistroNotes
Ubuntu 22.04, 24.04, 26.04jammy, noble, resolute
Debian 12, 13bookworm, trixie
Kali Linux rollingtracks Debian sid

Tier 2 โ€” file issues if anything breaks

All 23 tools land cleanly; either modern enough not to need any softening, or quirks we haven't fully characterized:

Testing: โœ“ Docker matrix ยท ~ automated VM matrix (in progress) ยท โœ— manual VM

DistroPkg manager
Fedora 40, 41, 42, 43, 44dnf
Rocky Linux 9, 10dnf + EPEL
AlmaLinux 9, 10dnf + EPEL
CentOS Stream 9, 10dnf + EPEL
Amazon Linux 2023dnf (no EPEL)
Arch Linuxpacman
Manjaropacman
Alpine Linuxapk (musl)
openSUSE Tumbleweedzypper
Void Linuxxbps
macOS (Intel + Apple Silicon)Homebrew
WSL2 (Ubuntu/Debian under Windows)inherits parent

Tier 3 โ€” degraded with explicit Known Limitations

Install succeeds; the engine prints a "Known limitations on this platform" notice explaining which specific tools couldn't land and why. Almost always it's helix and neovim โ€” their upstream binaries require glibc 2.34+ and ship no musl variant, so older distros either fall through to an older distro-packaged nvim (which works fine) or end up genuinely missing hx.

If you hit a new wrinkle on one of these distros, expect that fixing it may require softening the install scripts โ€” that's the contract of Tier 3.

Testing: โœ“ Docker matrix ยท โœ— automated VM ยท โœ— manual VM

DistroTools landedWhat's degraded
openSUSE Leap 15.623/23None โ€” qsv routes to its musl variant transparently (glibc 2.38)
Debian 11 bullseye21/23helix, neovim (glibc 2.31; nvim distro fallback installs 0.4.4)
Ubuntu 20.04 focal21/23helix, neovim (glibc 2.31; same shape as Debian 11)
Rocky Linux 8, AlmaLinux 821/23helix, neovim (glibc 2.28; EPEL 8 has nvim 0.8.0)
Amazon Linux 221/23helix, neovim (glibc 2.26; yum-era)
CentOS 721/23helix, neovim (glibc 2.17; yum-era; Dockerfile points yum at vault.centos.org since the base mirror was decommissioned post-EOL)

For the legacy-glibc distros (anything in the table above with glibc < 2.28), five Rust binaries โ€” bat, fd, eza, lsd, starship โ€” automatically route to their musl variants via the registry's GLIBC_MIN fallback. You'll get the same version of those tools as on a modern distro, just statically linked against musl.

What we don't test

This isn't a "we couldn't be bothered" list โ€” these are deliberately out of scope, mostly because they're architectural mismatches with shell-bling's "drop pinned binaries into /usr/local/bin" model:

  • NixOS, GuixSD โ€” functional package management. Tools should be in /nix/store with proper Nix expressions, not bolted into /usr/local/bin.
  • CoreOS, Flatcar, Bottlerocket, ChromeOS โ€” immutable OSes; /usr is read-only.
  • The BSDs (FreeBSD, OpenBSD, NetBSD) โ€” different OS family; most of our pinned upstream binaries don't have BSD variants.
  • SLES 15 โ€” official Docker images require a SUSE subscription. openSUSE Leap 15.6 (which we DO test) is the open-source counterpart.
  • Linux Mint LMDE, Pop!_OS, EndeavourOS, Parrot OS โ€” covered transitively by their parent distros (Debian / Ubuntu / Arch). Should Just Work, but we don't run them through CI.

Tier 1 platforms are tested in CI on every commit, plus through automated and manual VM cycles. Tier 2 and Tier 3 are best-effort โ€” please file issues if you hit something the Known Limitations notice doesn't cover.

Try before you install

git clone https://github.com/hiAndrewQuinn/shell-bling-ubuntu
cd shell-bling-ubuntu
make dev DISTRO=ubuntu-24.04   # or debian-13, ubuntu-22.04, etc.

This drops you into an interactive shell inside a fresh container after the installer runs. Great for kicking the tires.

Poking at it like a real machine (SSH into the container)

If you want the container to stick around โ€” to attach from a second terminal, scp files in/out, or just have it feel like a remote machine:

make dev-bg DISTRO=debian-13          # also installs sshd, port 2222
# wait for the "dev container ready" marker, then:
ssh -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null dev@localhost
# or attach in-place:
docker exec -it sbu-dev-debian-13 fish
# tear down when done:
make dev-down DISTRO=debian-13

Don't want to remember the distro string? Skip DISTRO= and the script pops an fzf picker (or falls back to a numbered prompt) listing every docker/*.Dockerfile it finds:

sh docker/dev-bg.sh                   # interactive picker
sh docker/dev-bg.sh random            # roll one at random
sh docker/dev-bg.sh --list            # just print available distros

dev-bg copies every ~/.ssh/*.pub you have into the container's authorized_keys so any of your existing keys will get you in. Override the port with DEV_PORT=2244, or pin to one specific key with DEV_PUBKEY_GLOB='~/.ssh/work_*.pub'.

Differences from make dev:

make devmake dev-bg
install runsyesyes (non-interactively)
stays up after installno (drops to foreground shell, exits on logout)yes (until make dev-down)
sshdnoyes, port $DEV_PORT (default 2222)
fzf pickersyes (real tty)no (skipped via SHELL_BLING_NONINTERACTIVE=1)
best forfirst-time "look around"repeated experimentation

What's in the box

The Holy Trinity โ€” search, search, search
  • fzf โ€” fuzzy search anything. Ctrl+R for history, Alt+C for cd.
  • fd โ€” fast, friendly find. We symlink fdfind โ†’ fd.
  • ripgrep โ€” rg, the fastest grep.
Shells & terminals
  • fish โ€” autocomplete + syntax highlighting out of the box.
  • starship โ€” fast, minimal, customizable prompt.
  • tmux โ€” terminal multiplexer.
  • kitty โ€” GPU-based terminal with ligature support, set up with FiraCode Nerd Font.
  • xclip + wl-clipboard โ€” pipe to/from the system clipboard. Both installed so the same scripts work on X11 and Wayland (each one no-ops on the other's display server).
Help & cheatsheets
  • tldr (the tealdeer Rust client) โ€” simplified man pages.
  • cheat โ€” interactive cheatsheets.
File & directory tools
  • zoxide โ€” smarter cd that learns your habits.
  • lsd + eza โ€” modern ls with icons & colors.
  • tree โ€” directories as a tree.
  • rsync โ€” smart file copy/sync, locally or over ssh.
Editors
  • bat โ€” cat with syntax highlighting.
  • micro โ€” easy terminal editor.
  • vim + Neovim with LazyVim starter.
  • helix โ€” postmodern, zero-config editor.
Dev & coding
  • git + git-delta โ€” version control + pretty diffs.
  • lazygit โ€” git TUI.
  • gh โ€” GitHub CLI.
  • uv โ€” fast Python package + venv manager.
  • gopass โ€” modern, pass-compatible password manager.
JSON
  • jq โ€” the de-facto JSON query language. Filter, reshape, project. Powerful, opinionated, with its own little DSL to learn.
  • gron โ€” makes JSON greppable. Flattens any blob into one foo.bar[3].baz = "..." line per leaf so you can rg / grep / fzf through it with tools you already know. Round-trips back to JSON with gron -u. A very different beast from jq.
Other data wrangling
  • qsv โ€” fast CSV scalpels (sub-commands for select, search, stats, join, frequency, etc.).
  • sqlite3 โ€” the world's most-used database, on tap for any "I need a real query for ten minutes" moment.
System & logs
  • htop โ€” process viewer.
  • lnav โ€” interactive log file viewer.
Compilers & runtimes (needed by LazyVim)

curl, gcc, g++, make, nodejs.

Environment variables

VarEffect
SHELL_BLING_NONINTERACTIVE=1Skip the editor fzf picker; default editor=nvim.
SHELL_BLING_SKIP_LAZYVIM=1Don't clone LazyVim starter.
SHELL_BLING_BYPASS_SIZE=1Override the disk-space preflight (which needs ~1 GB free on $HOME).
SHELL_BLING_LIB_DIR=PATHOverride where lib/ is loaded from.

Footprint

Resident install is ~600 MB (Neovim + LazyVim + apt packages + the registry-installed static binaries). shell-bling no longer installs language toolchains โ€” if you want Rust, Go, or uv, install them yourself from their official sources after shell-bling runs. The principle: shell-bling is a productive-shell installer, not a language-toolchain manager.

Hacking on it

pre-commit install
make lint           # shellcheck + shfmt + fish_indent + general hygiene
make test           # build + smoke-test every supported distro
make test-debian-13 # one distro
make dev            # interactive container after install

License

The Unlicense โ€” released into the public domain. Do what you want with it.