Skip to content

Install

The entire install is one line:

Terminal window
curl -fsSL https://nebelhaus.com/init.sh | bash

That scaffolds your config and installs Nix if you don’t have it. It does not change your system on its own — it writes files and then tells you the one command that activates them. Nothing is switched until you run that command.

  • A Mac running a recent macOS (Apple Silicon only — Intel Macs aren’t supported).
  • Xcode Command Line Tools. The installer will trigger the install prompt if they’re missing, then ask you to re-run.
  • About 10–15 minutes and a few GB of download for the first build.

curl … | bash runs whatever the URL serves. nebelhaus.com/init.sh only proxies the rice’s bootstrap.sh from this org’s own repo — it’s boring and readable on purpose. To inspect it before running:

Terminal window
# print it instead of running it
curl -fsSL https://nebelhaus.com/init.sh | less
# or pin an exact release tag and diff it against GitHub
curl -fsSL 'https://nebelhaus.com/init.sh?ref=v2026.07.18' | less

By default the one-liner serves the latest release tag; before the first release it falls back to main. Releases are date-tagged, so add ?ref=v2026.07.18 to pin a specific day’s version.

  1. Preflight. Confirms you’re on macOS, reads your username and hostname, and takes a Time Machine local snapshot as a coarse rewind point (non-fatal if Time Machine is off).

  2. Prerequisites. Checks for Xcode CLT (prompts if missing) and installs Determinate Nix if /nix isn’t already set up. It refuses to run on top of a non-Determinate Nix install rather than risk breaking it.

  3. Interview. A short gum TUI asks for your git name and email, a preset (Full rice / Minimal / Custom — which decides the sill, prowl, and pounce rooms), your accent colour (default mauve), a wallpaper (default: keep yours), your $EDITOR (default hx) — and whether to keep your current macOS settings (Dock/keyboard/Finder) and adopt your existing Homebrew casks into the new config. Every answer has an environment-variable override for non-interactive runs (see below).

  4. Preflight audit. A read-only report of what the first switch will change: existing Homebrew casks (none are removed), dotfiles that will be backed up, and the macOS settings that will change (Dock autohide, key repeat, Caps-Lock remap if prowl is on, ⌘Space reassignment if pounce is on).

  5. Scaffold. Creates ~/.config/nix/ with a thin flake.nix that imports github:nebelhaus/nebelhaus, plus a hosts/<hostname>/default.nix holding your identity and choices. It git inits and commits the result.

Nothing is activated yet. The bootstrap ends by printing the build command.

Terminal window
cd ~/.config/nix
nix build .#darwinConfigurations.$(scutil --get LocalHostName).system \
&& sudo ./result/sw/bin/darwin-rebuild switch --flake .

The build runs first; a failed build never touches your system. Once it succeeds, switch activates everything: apps install, background agents start, dotfiles land, and the haus command joins your PATH. First run takes a while — it’s downloading the world. Subsequent rebuilds are fast.

Then head to First run to learn the muscle memory.

Every interview answer has an environment-variable override, so you can run the whole thing unattended:

Terminal window
NEBELHAUS_NONINTERACTIVE=1 \
NEBELHAUS_GIT_NAME="Ada Lovelace" \
NEBELHAUS_GIT_EMAIL="ada@example.com" \
NEBELHAUS_ROOMS="sill,prowl,pounce" \
NEBELHAUS_ACCENT="mauve" \
NEBELHAUS_WALLPAPER="none" \
NEBELHAUS_EDITOR="hx" \
bash -c "$(curl -fsSL https://nebelhaus.com/init.sh)"

Other useful knobs:

Variable / flagEffect
NEBELHAUS_DRY_RUN=1Print the generated config instead of writing it
NEBELHAUS_NONINTERACTIVE=1 or --defaultsSkip the interview, accept all defaults
NEBELHAUS_KEEPWhich current macOS settings to keep (dock,keyboard,finder)
NEBELHAUS_DIRScaffold somewhere other than ~/.config/nix
--from <url> / NEBELHAUS_FROMRestore an existing config instead of scaffolding — see Moving to a new Mac

You can hand most of this to an AI agent. The site publishes a machine-readable index at nebelhaus.com/llms.txt (and the whole corpus at llms-full.txt), so any tool that can fetch a URL can read the real documentation instead of guessing from whatever it remembers about Nix.

Paste something like this:

Read https://nebelhaus.com/llms.txt and then the install page it links to.
I want to install nebelhaus on this Mac.
Do the parts you can: run the bootstrap with NEBELHAUS_DRY_RUN=1 first and show
me the config it would write, then run it for real, then run the `nix build`.
Stop and hand back to me for anything needing sudo — I'll run those myself.

What an agent can and can’t do here, which is worth being explicit about:

StepWho
Read the docs, choose options, dry-run the bootstrapagent
Run the bootstrap (scaffold ~/.config/nix)agent
Review the generated host file with youagent
nix build .#darwinConfigurations.<host>.systemagent
Install Determinate Nix · the first darwin-rebuild switchyou

The last row is the real boundary: both need sudo, and Touch ID for sudo (collar) doesn’t exist until after that first switch — so they want an interactive password prompt an agent pane can’t answer. Everything up to “the build succeeded” is fair game, and a failed build activates nothing.

Prefer the non-interactive variables above when an agent drives the bootstrap: the interview is a gum TUI, and a tool driving it blind is how you end up with someone else’s git identity in your config.

You don’t have to take the whole rice:

Terminal window
brew tap nebelhaus/tap
brew install pounce
brew services start pounce
pounce --request-accessibility

See pounce and the palette for the standalone stories.