A streamlined provisioning tool for setting up new Debian-based systems (Ubuntu, Linux Mint, etc.) with all your essential development tools.
- Fully Automated: One command installs everything with minimal interaction
- Idempotent: Safe to run multiple times - won't reinstall existing tools
- Smart Selection: Only prompts for truly optional tools (Slack, Discord, Unity/DotNet)
- Modern Stack: Fish shell, Homebrew, FNM, and cutting-edge CLI tools
Run this single command on a fresh Debian-based system:
curl -fsSL https://raw.githubusercontent.com/Abourass/provision/main/setup.sh | bashThis command will:
- Install git if not already present
- Clone the repository to
~/provision - Run the bootstrap script to provision your entire system
Note: Safe to run multiple times! If
~/provisionalready exists, it will pull the latest changes and re-run.
If you prefer to review the code first or already have git installed:
# Clone this repo
git clone https://github.com/Abourass/provision.git ~/provision
cd ~/provision
# Run the bootstrap script
./bootstrap.shThe bootstrap.sh script auto-installs core dependencies:
- curl, git, build-essential: Essential build tools
- Fish Shell: Modern shell (via PPA release-4)
- Homebrew: Package manager for Linux
- Gum: Interactive CLI tool
- FNM: Fast Node Manager
- PNPM: Fast, efficient package manager
You'll see a Gum selector with only these optional tools:
- Slack: Team communication platform
- Discord: Chat and voice platform
- DotNet SDK: For Unity game development
Everything else installs automatically.
All required tools install automatically:
Development Languages:
- Node.js (latest LTS via FNM)
- Bun (JavaScript runtime)
- Go (1.22.0)
CLI Tools:
- Oh My Posh: Shell prompt theming
- APT tools: bat, cbonsai, cowsai, fortune, jp2a, linuxlogo, toilet, hyfetch, pv, sqlite3, jq
- Homebrew tools: glow, fzf, timg, watchman, lsd, fx, navi, rig, ripgrep, eza, zoxide, fd
Desktop Software:
- Brave Browser (privacy-focused browser)
- VS Code (code editor)
Shell Configuration:
- Claude Code (CLI tool for Claude AI)
- Oh My Posh configuration (FiraCode font, Claude feature, custom theme)
- Familiar Says (greeting tool with fortune integration)
- Complete Fish shell configuration with all integrations
curl setup.sh | bash (or ./setup.sh)
↓
Check & Install: git (if needed)
↓
Clone/Update: provision repo
↓
./bootstrap.sh
↓
Install: curl, build-essential
↓
Install: Fish shell (PPA)
↓
Install: Homebrew
↓
Verify: Homebrew in PATH (or abort with instructions)
↓
Install: Gum, FNM, PNPM
↓
Launch: main.fish
↓
Prompt: "Select optional tools" (Slack, Discord, DotNet)
↓
Auto-install all modules:
- dev-languages
- cli-tools
- software
- editors
- shell-config (prompts for code location)
↓
Done!
provision/
├── setup.sh # Quick setup wrapper (installs git + runs bootstrap)
├── bootstrap.sh # Core tools installer (bash)
├── main.fish # Orchestrator with optional tool selection
├── modules/ # Auto-run installation modules
│ ├── dev-languages.fish # Node, Bun, Go, DotNet
│ ├── cli-tools.fish # Oh My Posh + modern CLI tools
│ ├── software.fish # Brave, Slack, Discord
│ ├── editors.fish # VS Code
│ └── shell-config.fish # Claude Code, oh-my-posh config, familiar-says, fish config
├── lib/
│ └── helpers.fish # Shared utility functions
└── config/ # Future: config files
If any tool is already installed, the script will detect it and skip reinstallation, showing:
✓ tool-name already installed
This makes the script safe to run multiple times.
The bootstrap script verifies Homebrew is accessible after installation. If not found in PATH, it will abort with clear instructions:
ERROR: Homebrew was installed but is not in PATH.
Please add Homebrew to your PATH by running:
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
Then add this line to your shell configuration file:
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrc
After updating your PATH, re-run this script.
chsh -s $(which fish)The shell-config module automatically configures your Fish shell with:
- Custom oh-my-posh theme with Claude integration
- Familiar-says greeting with fortune integration
- Homebrew completions
- Go, PNPM, and Bun environment setup
- FNM and Zoxide initialization
Your ~/.config/fish/config.fish is automatically created with all necessary configurations.
To activate the configuration after installation:
source ~/.config/fish/config.fish
# or restart your terminalAvailable in lib/helpers.fish for custom modules:
is_installed <command>: Check if a command existsapt_install <package> [check_cmd]: Install apt package if missingbrew_install <package> [check_cmd]: Install Homebrew package if missingcargo_install <package> [check_cmd]: Install cargo package if missingnpm_install_global <package> [check_cmd]: Install npm package globallysnap_install <package> [flags]: Install snap package if missingadd_ppa <ppa>: Add PPA repository if not already addedmodule_header <title>: Print formatted module headersuccess <message>: Print success messageerror <message>: Print error messageconfirm <prompt>: Ask for confirmation via Gum
- Create a new file in
modules/(e.g.,modules/my-tools.fish) - Use the helper functions from
lib/helpers.fish - Make it executable:
chmod +x modules/my-tools.fish - Add it to the modules list in
main.fish
#!/usr/bin/env fish
# My Custom Tools Module
set SCRIPT_DIR (dirname (status -f))
source $SCRIPT_DIR/../lib/helpers.fish
module_header "My Custom Tools"
# Install from apt
echo "Installing vim..."
apt_install vim
# Install from brew
echo "Installing htop..."
brew_install htop
success "Custom tools installed!"You can run individual modules for testing:
fish modules/cli-tools.fishNote: Some modules (like dev-languages) require tools from bootstrap to be installed first.
- Debian-based Linux distribution (Ubuntu, Linux Mint, Pop!_OS, etc.)
sudoaccess- Internet connection
If bootstrap fails with PATH error, manually add Homebrew to PATH and re-run:
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
./bootstrap.shEnsure bootstrap.sh completed successfully. FNM should be installed during bootstrap phase.
Check the module output for specific error messages. Most errors are due to network issues or missing sudo permissions.
To change which tools are required vs optional:
- Edit
main.fishto add/remove items from theoptional_toolslist - Update the corresponding module to check the environment variable
- Set environment variables like
INSTALL_TOOLNAMEto "yes" or "no"
MIT