Skip to content

Bedouin

The house you strike, carry, and pitch again identically on new ground.
Bedouin

One YAML config in git, and any machine — Ubuntu, SUSE, macOS — becomes yours. A single static binary that runs on a box with nothing installed on it.

Terminal window
curl -fsSL https://samishal1998.github.io/bedouin/install.sh | sh
bedouin plan
Bedouin will make the following changes:
+ manager brew not installed
+ language rust 1.80 rustup
! ~ package zellij 0.39.2 -> 0.40.1 cargo
+ file ~/.gitconfig from templates/gitconfig.j2
+ rc ~/.zshrc.d/70-zellij.zsh owned by zellij
- package ripgrep was: apt, owner: bedouin
Plan: 4 to add, 1 to change, 1 to remove.

Nothing to install first

A static binary with zero runtime dependencies. Ansible needs a working Python, which is the one thing a fresh machine cannot promise.

One run, in order

Install a toolchain and something that needs it in the same run. Bedouin tracks where it put things and builds each step’s environment itself instead of inheriting your shell’s.

It tells you first

plan is a faithful prediction of apply. Where it cannot be, it says so rather than guessing.

Your edits survive

Tweak an alias in your shell, then absorb it back into the config. Bedouin owns blocks inside your rc files, never the files.

Conditionals that cannot rot

A mapping means branches, and arm names come from a closed set — so a typo is an error, not a branch that never matches on a machine you are not sitting at.

It only removes what it installed

Anything already there when Bedouin first ran is adopted, never owned, and survives being dropped from the config.

Your shell, not just your tools

Install oh-my-zsh, set its theme and plugins — written above the line that reads them, because below it would do nothing at all.

Configs that live in git

Clone a repository, link a subdirectory of it into place. How oh-my-tmux installs, and how a neovim config reaches ~/.config/nvim with its history intact.