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:
- Detect your platform.
- Ask for your sudo password once (and keep the timestamp alive in the background).
- Install everything silently.
- Open one
fzfpicker for your default editor (nvim/vim/hx/micro).fishbecomes your login shell automatically. - 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
| Distro | Notes |
|---|---|
| Ubuntu 22.04, 24.04, 26.04 | jammy, noble, resolute |
| Debian 12, 13 | bookworm, trixie |
| Kali Linux rolling | tracks 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
| Distro | Pkg manager |
|---|---|
| Fedora 40, 41, 42, 43, 44 | dnf |
| Rocky Linux 9, 10 | dnf + EPEL |
| AlmaLinux 9, 10 | dnf + EPEL |
| CentOS Stream 9, 10 | dnf + EPEL |
| Amazon Linux 2023 | dnf (no EPEL) |
| Arch Linux | pacman |
| Manjaro | pacman |
| Alpine Linux | apk (musl) |
| openSUSE Tumbleweed | zypper |
| Void Linux | xbps |
| 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
| Distro | Tools landed | What's degraded |
|---|---|---|
| openSUSE Leap 15.6 | 23/23 | None โ qsv routes to its musl variant transparently (glibc 2.38) |
| Debian 11 bullseye | 21/23 | helix, neovim (glibc 2.31; nvim distro fallback installs 0.4.4) |
| Ubuntu 20.04 focal | 21/23 | helix, neovim (glibc 2.31; same shape as Debian 11) |
| Rocky Linux 8, AlmaLinux 8 | 21/23 | helix, neovim (glibc 2.28; EPEL 8 has nvim 0.8.0) |
| Amazon Linux 2 | 21/23 | helix, neovim (glibc 2.26; yum-era) |
| CentOS 7 | 21/23 | helix, 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/storewith proper Nix expressions, not bolted into/usr/local/bin. - CoreOS, Flatcar, Bottlerocket, ChromeOS โ immutable OSes;
/usris 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 dev | make dev-bg | |
|---|---|---|
| install runs | yes | yes (non-interactively) |
| stays up after install | no (drops to foreground shell, exits on logout) | yes (until make dev-down) |
| sshd | no | yes, port $DEV_PORT (default 2222) |
| fzf pickers | yes (real tty) | no (skipped via SHELL_BLING_NONINTERACTIVE=1) |
| best for | first-time "look around" | repeated experimentation |
What's in the box
The Holy Trinity โ search, search, search
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
File & directory tools
Editors
Dev & coding
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 canrg/grep/fzfthrough it with tools you already know. Round-trips back to JSON withgron -u. A very different beast fromjq.
Other data wrangling
Compilers & runtimes (needed by LazyVim)
curl, gcc, g++, make, nodejs.
Environment variables
| Var | Effect |
|---|---|
SHELL_BLING_NONINTERACTIVE=1 | Skip the editor fzf picker; default editor=nvim. |
SHELL_BLING_SKIP_LAZYVIM=1 | Don't clone LazyVim starter. |
SHELL_BLING_BYPASS_SIZE=1 | Override the disk-space preflight (which needs ~1 GB free on $HOME). |
SHELL_BLING_LIB_DIR=PATH | Override 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.