Manual install — git clone + ./install.sh
Clone the repo first, read what you're about to run, then drive the installer with --only, --skip, --dry-run, --modules, and --man.
If you’d rather see the code before running it, clone the repo, read what you want, then run the installer manually. Same end result as the one-liner — just without the curl-to-bash trust.
# Clone
git clone https://github.com/rafay99-epic/dotfiles.git ~/dotfiles
cd ~/dotfiles
# Run installer
chmod +x install.sh
./install.sh The first run will drop you into the same first-run wizard as the curl path, then the module picker.
Flags worth knowing
| Flag | What it does |
|---|---|
--dry-run | Preview every action without making any changes. Symlinks aren’t created, Homebrew isn’t
invoked, no |
--yes / -y | Run all modules, auto-confirm every sub-prompt. Skips the picker. |
--only=symlinks,macos | Run only these modules (skips the picker). Mutually exclusive with --skip. |
--skip=wm,homebrew | Run everything except these. |
--reconfigure | Re-run the wizard, re-asking every question. Use this to change your NAS, fix a typo, flip a feature on/off. |
--modules | Print the available module list and exit. |
--man | Open the full manpage. |
--help | Short usage summary. |
CI-friendly env-var equivalent of --only:
INSTALL_MODULES=symlinks,macos ./install.sh
The interactive picker
install.sh is a thin orchestrator. Each major step lives in its own install.d/<NN-name>.sh file that defines one function: module_<name>(). With no flags, the orchestrator builds a list of those modules and hands you an arrow-key picker.
The picker is pure bash — no whiptail / dialog dependency, so it works on a bare macOS install before Homebrew has installed anything else.
| Key | Action |
|---|---|
↑ / ↓ (or j / k) | Move the cursor |
| Space | Toggle the highlighted module |
| a | Select all |
| n | Clear all |
| r | Reset to defaults |
| Enter | Confirm and run |
q / Esc | Quit without running |
The footer shows a live Selected: X/8 counter. The frame is redrawn flicker-free as a single printf per tick.
Selection precedence
When multiple selection inputs are present, the orchestrator resolves them in this order (highest first):
--only=--skip=--yes$INSTALL_MODULESenv var- Interactive picker (default)
--only and --skip are mutually exclusive — the orchestrator errors out if both are given.
Examples
./install.sh # interactive arrow-key picker
./install.sh --dry-run # preview every action, no changes
./install.sh --yes # run all modules, auto-Y every prompt
./install.sh --only=symlinks,macos # run only these modules (skip picker)
./install.sh --skip=wm,homebrew # run everything EXCEPT these
./install.sh --modules # print available module list
./install.sh --man # open the man page
./install.sh --help
Where to go next
- Quick install — just the curl one-liner, nothing else.
- Multi-machine portability — why the same clone works on any Mac, any username.
- Asking important questions — the wizard prompts you’ll see on the first run.
- Installing — what gets installed — the inventory of brews, casks, fonts, and configs.