For usage instructions, see README.md.
├── setup.sh # Unified setup (auto-detects OS)
├── stow-dotfiles.sh # OS-aware stow (auto-detects OS)
├── update.sh # Update script
└── scripts/
├── setup/
│ ├── packages-osx.sh
│ ├── packages-pi.sh
│ └── packages-linux.sh
└── setup-pi.sh
├── setup-osx.sh
└── setup-linux.shBREW_PACKAGES- CLI tools (installed viabrew install)CASK_PACKAGES- GUI applications (installed viabrew install --cask)PACKAGES- Auto-generated (DO NOT EDIT)
APT_PACKAGES_BASE- Base CLI tools (installed viaapt install)APT_PACKAGES- Extended APT packagesAPT_PACKAGES_PI- Raspberry Pi specific packagesSPECIAL_PACKAGES_BASE- Custom installation required (nvm, pyenv, tailscale, etc.)SPECIAL_PACKAGES- Extended special packagesGUI_PACKAGES- GUI applicationsPACKAGES- Auto-generated (DO NOT EDIT)
APT_PACKAGES_BASE- Base CLI tools (installed viaapt install)APT_PACKAGES- Extended APT packagesAPT_PACKAGES_PI- Raspberry Pi specific packagesSPECIAL_PACKAGES_BASE- Custom installation required (nvm, pyenv, tailscale, etc.)SPECIAL_PACKAGES- Extended special packagesPACKAGES- Auto-generated (DO NOT EDIT)
is_brew_package_installed(package)- Check if brew package installedis_cask_installed(package)- Check if cask installedis_package_installed(package)- Auto-detect and checkget_package_info(package)- Get detailed package infolist_packages()- List all packages with statusvalidate_package_config()- Validate configuration
is_apt_package_installed(package)- Check if APT package installedis_command_available(command)- Check if command availableis_tailscale_installed()- Check if Tailscale installedget_package_info(package)- Get detailed package infolist_packages()- List all packages with status_detect_distribution()- Auto-detect distro, version, codename, architecture_is_apt_available()- Check APT availability
- Add to array in
scripts/setup/packages-osx.sh:BREW_PACKAGES=("existing" "new-package") # or CASK_PACKAGES=("existing" "new-app")
- Validate:
./setup.sh validate
- Add to appropriate array in
scripts/setup/packages-linux.sh:APT_PACKAGES_BASE=("existing" "new-package") # or SPECIAL_PACKAGES_BASE=("existing" "new-special") # or APT_PACKAGES_PI=("pi-package") # Raspberry Pi only
- If custom installation needed, add logic to
scripts/setup-linux.sh
macOS:
- Auto array sync (
PACKAGESfromBREW_PACKAGES+CASK_PACKAGES) - Input validation & Homebrew checks
- Configuration validation (duplicates, overlaps)
- Type detection (brew vs cask)
Linux:
- Auto distribution detection (Debian/Ubuntu, version, codename, arch)
- Cross-distribution support
- Architecture-aware
- Package type detection (APT, special, GUI)
- Duplicate detection within arrays
- Package overlap prevention
- Auto-generated
PACKAGES(no manual sync) - Package manager availability checks
- Input validation
- Distribution compatibility verification
Tailscale:
- macOS: Homebrew cask
- Linux: Official script (
curl -fsSL https://tailscale.com/install.sh | sh)
Development Tools:
nvm- Script-basedpyenv- Git-basedrust- rustup installermise- Script-baseddevbox- Script-based
- All scripts support
DRY_RUN=true - Linux scripts require
sudofor package installation - NixOS:
setup.shprovides guidance, usestow-dotfiles.shfor dotfiles - Raspberry Pi: Uses standard Linux setup, Pi-specific packages in
APT_PACKAGES_PI