bash -c "$(curl -fsSL https://raw.githubusercontent.com/kalindudc/shell/main/install.sh)"Requires: curl (git and ruby are auto-installed if missing)
The installer uses a two-stage design:
-
Bash Bootstrap (
install.sh~60 lines)- If run via curl: clones repo, re-executes from clone
- Installs git if missing
- Installs ruby if missing
- Hands off to Ruby orchestrator
-
Ruby Orchestrator (
src/install.rb~300 lines)- Detects OS (Arch, Ubuntu, Debian, macOS)
- Reads
packages.ymlfor package list - Installs packages via detected backends
- Generates configs, stows dotfiles, sets up shell
# Verbose output
./install.sh --trace
# Run stow only (skip package installation)
./install.sh --stow
# Non-interactive
NONINTERACTIVE=1 ./install.shEdit packages.yml and add a line under the appropriate backend:
pacman:
- existing-package
- your-new-package # <-- add here for Arch
apt:
- existing-package
- your-new-package # <-- add here for Ubuntu/Debian
brew:
- existing-package
- your-new-package # <-- add here for macOSBackends are organized by package manager, not by OS:
| Backend | Description | Platforms |
|---|---|---|
pacman |
System packages | Arch |
yay |
AUR packages | Arch |
apt |
System packages | Ubuntu, Debian |
snap |
Snap packages | Ubuntu |
flatpak |
Flatpak apps | Linux |
brew |
Homebrew formulas | macOS |
brew_cask |
Homebrew casks | macOS |
npm |
Global npm packages | All |
pipx |
Python CLI tools | All |
custom |
Special installers | All |
Packages in the custom: section call Ruby methods for complex installations:
install_docker_post— enable docker service, add user to docker groupinstall_pyenv— install pyenv via curlinstall_gum— install charmbracelet/gum via goinstall_zsh_plugins— clone zsh plugins used by the generated configinstall_fzf_latest— download latest fzf from GitHubinstall_atuin— install Atuin history search/sync via the official installer fallbackinstall_delta_deb— download git-delta .deb for Ubuntuinstall_zoxide_curl— install zoxide via curlinstall_starship_curl— install starship via curlinstall_fnm_curl— install fnm via curlinstall_nerd_fonts_brew— install all nerd fonts via brewinstall_nvm_curl— install nvm via curl (fallback)
To add a custom installer, add the method name to custom: in packages.yml and define the method in src/install/custom.rb.
The installer reads configuration from SHELL_DIR/.env:
GIT_EMAIL=you@example.com
GIT_NAME=Your Name
GIT_SIGNING_KEY=YOUR_GPG_KEY_IDIf .env is missing, git config values are used as fallbacks.
exec zsh # Restart shell
# Verify key tools
starship --version
fzf --version
atuin --version
atuin doctor
nvim --versionAtuin replaces the legacy oh-my-zsh history aliases (h, hl, hs, hsi) and old Ctrl-R history search. fzf still handles non-history workflows such as completion, Ctrl-T, Alt-C, Kubernetes helpers, and todo tooling; native zsh still handles Up/Down prefix search until Atuin changes directory filtering for those keys.
Migration is manual and safe by default: import existing zsh history with HISTFILE=$HOME/.zsh_history atuin import zsh, open interactive search with atuin search -i, inspect your encryption key with atuin key, then opt into sync with atuin sync or force reconciliation with atuin sync -f when needed. Before pruning imported history, review atuin history prune --dry-run.
Only non-secret Atuin client config is tracked in this repo. Atuin secrets and state, including keys, sessions, and history.db, stay in Atuin's default data directory under ~/.local/share/atuin and should not be committed.
Installation interrupted? Just re-run ./install.sh — it's idempotent.
Need to skip slow backends? Set SKIP_BACKENDS:
SKIP_BACKENDS=snap,npm ./install.shWant to see what's happening? Use --trace for verbose output.