Skip to content
Projects

Gaudi

Automate and Simplify New Machine Setups

As a developer, you have probably experienced the frustration of setting up a new machine. Whether it is a fresh install of the operating system or a brand-new device, reinstalling your go-to applications, configuring development environments, and getting everything to run smoothly is a tedious chore. I know this pain all too well, which is why I built : a Bash-based command line tool that sets up machines from reusable software lists, hooks, configuration scripts, and templates.

Status: Actively maintained. The was last pushed in June 2026. macOS and Debian/Ubuntu setup paths are fully automated; other Linux families are detected and reported rather than guessed.

The Problem: Time-Consuming Setup

Reconfiguring a system from scratch means hours of:

  • Installing software and tools (, , , apt, and others)
  • Customizing system preferences
  • Setting up your favorite applications
  • Re-configuring settings to match your old system

It is a repetitive, manual process, and there is always a chance you will forget one or two critical steps, leaving your environment not quite right. I wanted a repeatable process: capture the setup once, replay it on every new machine, and share it between machines and people.

What is Gaudi?

Gaudi automates the setup path in separate, skippable stages: install OS prerequisites, configure SSH (so Git access is ready before cloning anything), clone or update a , suggest shell helpers such as or , install packages from template list files, run machine configuration scripts, and clean up. Every stage can be skipped with a flag, so it works interactively, as a dry smoke run, or inside a controlled provisioning flow.

Installation is a one-liner:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/g-udi/gaudi/master/install.sh)"

After setup, a gaudi command is installed with setup, backup, doctor, version, and help subcommands, and gaudi setup accepts --skip-* flags for each stage (--skip-prereqs, --skip-software, --skip-configs, and so on).

Templates: the actual mechanism

Everything machine-specific lives in templates, which are plain shell files. A software list is a file with metadata comments and an array, where each entry pairs a package with a description:

# @Name: Default# @Description: Core Homebrew formulae# @List: brewListexport brewList=(  "git::Distributed version control"  "jq::Command-line JSON processor")

List targets cover apt, Homebrew taps/formulae/casks, mas (Mac App Store), npm, pip, go, and gem. Hooks named pre.<target>.hooks.sh and post.<target>.hooks.sh (for example pre.brew.hooks.sh, post.npm.hooks.sh) run before or after each list, which gives you control over the exact setup process without editing Gaudi itself.

Machine configuration scripts are discovered from templates by the patterns *.configs.<os>.sh and *.configs.sh, and each defines an _info string and a _command function:

_info="Show Finder path bar"_command() {  defaults write com.apple.finder ShowPathbar -bool true}

Shell profile support covers Bash (.bash_profile on macOS, .bashrc elsewhere), Zsh, Fish, and a POSIX-like .profile fallback, with GAUDI_TARGET_SHELL available to force a different target.

The full stage-by-stage documentation, folder structure, and template reference live in the .