Small, focused, self-contained scripts to bootstrap a fresh machine — Linux servers and macOS workstations. Each script does one thing, checks its own requirements, and runs on its own. The code is kept simple on purpose: it should be friendly to people starting out with shell.
Heads-up: these are
curl … | bashinstallers. Read a script before running it — that is good hygiene for anything you pipe into a shell, ours included. You can always openhttps://install.gutocarvalho.net/<name>.shfirst.
The friendly front door is active.sh, a
thin dispatcher. With no argument (or list) it prints the
catalog; with one or more targets it installs them in order and stops on
the first failure:
# see everything available
curl -fsSL https://install.gutocarvalho.net/active.sh | bash -s -- list
# install one thing
curl -fsSL https://install.gutocarvalho.net/active.sh | bash -s -- docker
# chain several (runs in order)
curl -fsSL https://install.gutocarvalho.net/active.sh | bash -s -- docker vimrc ctopEvery script is also self-contained, so you can always skip the dispatcher and run one directly:
curl -fsSL https://install.gutocarvalho.net/docker.sh | bash| Target | What it installs |
|---|---|
docker |
docker (get.docker.com) + a minimal daemon.json +
bash-completion + docker-compose + ctop + the humaniza log
filter |
compose |
the standalone docker-compose binary |
ctop |
ctop, a top-like interface for containers |
lsd |
lsd, a modern ls with icons, plus
ls/ll/la/lt aliases
in root's .bashrc |
vimrc |
a minimal /root/.vimrc for servers |
kubectl |
kubectl, the kubernetes CLI |
kubetail |
kubetail — tail multiple pods/containers at once |
helm |
helm 3 (via the official get-helm-3) |
velero |
the velero client (backup/restore for kubernetes) |
k9s |
k9s, a terminal UI for kubernetes |
k8s-tools |
all of the above at once: kubectl, kubetail, helm, velero, k9s |
rke2 |
RKE2 (get.rke2.io) + the k8s-tools client tools |
| Target | What it installs |
|---|---|
brew |
Homebrew, and wires brew shellenv into
~/.zprofile |
panels |
two SketchyBar panels (top + bottom) with config, fonts and the Wi-Fi helper |
| Target | What it installs |
|---|---|
tmux |
tmux + my config (Dracula theme, no plugins); macOS via brew, Linux via apt |
starship |
starship prompt + my config (gruvbox_dark); macOS via brew, Linux
via the official installer; wires starship init into your
.bashrc/.zshrc |
Any of these also works through active.sh
(… | bash -s -- <target>).
# Linux (as root)
curl -fsSL https://install.gutocarvalho.net/docker.sh | bash
curl -fsSL https://install.gutocarvalho.net/compose.sh | bash
curl -fsSL https://install.gutocarvalho.net/ctop.sh | bash
curl -fsSL https://install.gutocarvalho.net/lsd.sh | bash
curl -fsSL https://install.gutocarvalho.net/vimrc.sh | bash
curl -fsSL https://install.gutocarvalho.net/kubectl.sh | bash
curl -fsSL https://install.gutocarvalho.net/kubetail.sh | bash
curl -fsSL https://install.gutocarvalho.net/helm.sh | bash
curl -fsSL https://install.gutocarvalho.net/velero.sh | bash
curl -fsSL https://install.gutocarvalho.net/k9s.sh | bash
curl -fsSL https://install.gutocarvalho.net/k8s-tools.sh | bash # all five at once
curl -fsSL https://install.gutocarvalho.net/rke2.sh | bash
# macOS (as your user)
curl -fsSL https://install.gutocarvalho.net/brew.sh | bash
curl -fsSL https://install.gutocarvalho.net/panels.sh | bash
# both
curl -fsSL https://install.gutocarvalho.net/tmux.sh | bash
curl -fsSL https://install.gutocarvalho.net/starship.sh | bashdocker installs Docker via get.docker.com,
plus bash-completion, the docker-compose plugin and ctop, and drops a
small opinionated /etc/docker/daemon.json:
8.8.8.8,
1.1.1.1) — deliberate workaround for the
systemd-resolved 127.0.0.53 stub that
containers can't reach. Override it per-host if you need split-horizon /
internal DNS.json-file driver capped
at 25m × 5 files, compressed (~125 MB per
container max), so container logs never fill the disk.live-restore — containers keep running
while the Docker daemon restarts.10.20.0.0/16 sliced
into /24s, i.e. 256 Docker networks available (headroom for
many compose stacks, instead of running out after a handful).It also drops humaniza in
/usr/local/bin — a tiny, dependency-free
(bash+awk) stdin filter that humanizes RFC3339
timestamps (2026-08-15T10:23:45.123Z →
2026-08-15 10:23:45) and colorizes log levels
(FATAL/ERROR/WARN/INFO/DEBUG).
Colors auto-disable when the output is not a TTY. Pipe any log stream
through it:
docker logs -f --tail=10 <container> | humaniza
journalctl -u some.service -f | humaniza
humaniza < /path/to/file.logrke2 installs RKE2
from get.rke2.io and the
k8s-tools client tools (kubectl, kubetail, helm, velero,
k9s) as a dependency. It installs the rke2 binary and its
systemd units only — it does not start a cluster for
you. Bring the node up yourself with
systemctl enable --now rke2-server (or
rke2-agent). Override defaults with RKE2_TYPE
(server/agent) and
RKE2_CHANNEL.
Installs Homebrew non-interactively and adds
brew shellenv to ~/.zprofile. Idempotent — if
brew is already there it just ensures the shellenv line. Homebrew
installs the Xcode Command Line Tools for you if they are missing.
Sets up two SketchyBar panels:
sketchybar, managed by
brew servicesbottom_bar, a renamed
copy of the sketchybar binary driven by its own LaunchAgentIt installs the fonts, deploys the config to
~/.config/{sketchybar,bottom_bar} (backing up anything
already there), and builds the Objective-C wifiname
helper that reads the real Wi-Fi SSID (macOS hides it otherwise).
Approve the Location prompt once, then sketchybar --reload.
Needs brew and the Xcode Command Line Tools. The config is
not vendored here — it is pulled from the open/mysketchybar
repo, the single source of truth for the panels.
Installs tmux and deploys the config to ~/.config/tmux
(tmux.conf + dracula.conf, no TPM/plugins). On
macOS it uses homebrew and installs a Nerd Font; on Debian-like Linux it
uses apt and swaps the clipboard command from pbcopy to
xclip/wl-copy. Run it as your normal user. The
config is vendored in tmux/.
Installs the starship prompt and
deploys my gruvbox_dark config to
~/.config/starship.toml (backing up anything already
there). On macOS it uses homebrew (and installs a Nerd Font); on Linux
it uses the official installer script (starship is not reliably packaged
in apt), dropping the binary in /usr/local/bin. It then
wires eval "$(starship init …)" into whichever of
~/.bashrc / ~/.zshrc exist, idempotently (a
marker block, so re-running never duplicates). Run it as your normal
user. The prompt needs a Nerd Font in your terminal. The config is
vendored in starship/.
abort, need_cmd,
refuse_if_present) so it can be piped straight into a shell
with no dependency on this repo. The cost is a few repeated lines — the
benefit is that any script works on its own.active.sh is only a dispatcher. It
holds a central catalog (name → script), downloads the
focused script(s) you ask for, refuses to run anything that does not
look like a script (fail-closed), and stops the chain on the first
failure. Adding a new installer is one line in its catalog.root, and curl/wget
(tar for the kubernetes bundles). They refuse to run if the
tool is already installed — remove it first. Binaries land in
/usr/local/bin.brew.sh bootstraps Homebrew;
panels.sh/tmux.sh assume it is present.daemon.json — the minimal docker daemon config fetched
by docker.sh.tmux/ and starship/ — the vendored
configuration deployed by tmux.sh /
starship.sh. The SketchyBar panels config lives in its own
repo, open/mysketchybar,
and is pulled by panels.sh (override with
PANELS_SRC / PANELS_ARCHIVE).Override the download source with environment variables when needed:
INSTALL_BASE_URL (active.sh), PANELS_SRC /
PANELS_ARCHIVE (panels.sh), TMUX_SRC /
TMUX_ARCHIVE (tmux.sh), STARSHIP_SRC /
STARSHIP_ARCHIVE (starship.sh).
Source, issues and merge requests: https://gitlab.gutocarvalho.net/open/install
Found a bug, a broken download, or want to add an installer? Open an issue or send a merge request — contributions are welcome.
The scripts are deliberately beginner-friendly — plain, linear shell
with commented steps and no clever tricks. New installers should keep
that style, stay self-contained, and get one line added to
active.sh's catalog.
Guto Carvalho — guto@bolha.io — https://gutocarvalho.net
On the fediverse:
@gutocarvalho@bolha.us@gutocarvalho@bolha.photos@gutocarvalho@bolha.tube@gutocarvalho@bolha.blogMattermost: https://mattermost.bolha.chat
Come say hi and learn about our collective at https://bolha.io ;)