Install
The entire install is one line:
curl -fsSL https://nebelhaus.com/init.sh | bashThat 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.
What you need first
Section titled “What you need first”- 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.
Reading it first (recommended)
Section titled “Reading it first (recommended)”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:
# print it instead of running itcurl -fsSL https://nebelhaus.com/init.sh | less
# or pin an exact release tag and diff it against GitHubcurl -fsSL 'https://nebelhaus.com/init.sh?ref=v2026.07.18' | lessBy 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.
What the bootstrap does
Section titled “What the bootstrap does”-
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).
-
Prerequisites. Checks for Xcode CLT (prompts if missing) and installs Determinate Nix if
/nixisn’t already set up. It refuses to run on top of a non-Determinate Nix install rather than risk breaking it. -
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(defaulthx) — 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). -
Preflight audit. A read-only report of what the first
switchwill 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). -
Scaffold. Creates
~/.config/nix/with a thinflake.nixthat importsgithub:nebelhaus/nebelhaus, plus ahosts/<hostname>/default.nixholding your identity and choices. Itgit inits and commits the result.
Nothing is activated yet. The bootstrap ends by printing the build command.
Build and switch
Section titled “Build and switch”cd ~/.config/nixnix 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.
Non-interactive / scripted installs
Section titled “Non-interactive / scripted installs”Every interview answer has an environment-variable override, so you can run the whole thing unattended:
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 / flag | Effect |
|---|---|
NEBELHAUS_DRY_RUN=1 | Print the generated config instead of writing it |
NEBELHAUS_NONINTERACTIVE=1 or --defaults | Skip the interview, accept all defaults |
NEBELHAUS_KEEP | Which current macOS settings to keep (dock,keyboard,finder) |
NEBELHAUS_DIR | Scaffold somewhere other than ~/.config/nix |
--from <url> / NEBELHAUS_FROM | Restore an existing config instead of scaffolding — see Moving to a new Mac |
Installing with an agent
Section titled “Installing with an agent”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 showme 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:
| Step | Who |
|---|---|
| Read the docs, choose options, dry-run the bootstrap | agent |
Run the bootstrap (scaffold ~/.config/nix) | agent |
| Review the generated host file with you | agent |
nix build .#darwinConfigurations.<host>.system | agent |
Install Determinate Nix · the first darwin-rebuild switch | you |
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.
Just want one piece?
Section titled “Just want one piece?”You don’t have to take the whole rice:
brew tap nebelhaus/tapbrew install pouncebrew services start pouncepounce --request-accessibilitynix run github:nebelhaus/pounce -- --helpAdd the flake and pull rendered themes for any tool:
inputs.nebelung.url = "github:nebelhaus/nebelung";# then reference ${nebelung.packages.${system}.default}/<tool>/...See pounce and the palette for the standalone stories.