What haus is
One file describes your Mac. One command makes the Mac match it. Everything else here is detail.
haus is a layer for macOS. You describe the machine you want in one text file: apps, window management, the bar, the shell, the colours, the macOS settings you always change by hand. Then one command makes the Mac match it.
haus.theme.accent = "sapphire";
haus.hearth.editorName = "neovim";
haus.roster.slack = { key = "s"; name = "Slack"; cask = "slack"; };haus rebuildSlack is installed and bound to a launcher key, your terminal is themed, and the change is a line in git you can read six months later.
That is the whole idea. The rest of these pages are the detail.
Why bother
- It survives the machine. A new Mac, or a wiped one, is one command away from being the old one, because the old one was text.
- It undoes. A failed build never activates. A regretted change is
haus rollback, atomic, in seconds. - It's one setting, not forty. The accent colour lands in the terminal, the file manager, git, the bar and the browser at once, because they all read the same value.
- Nothing is buried. Every knob is a documented option with a default, and
haus editopens the file that sets them.
You do not need to know Nix going in. It is what makes this reproducible, and the installer sets it up for you. You will pick some of it up over time, and that's the whole curve.
What's in the box
haus is organised into twelve rooms, each one a capability you can turn on, off, or leave alone. Turn on the ones you want; the rest cost you nothing.
| Room | What it does |
|---|---|
| Apps | One list holds every app, font and CLI tool, and where each installs from |
| Appearance | The palette, the accent, the wallpaper, fonts and interface scale |
| Displays | Per-screen scaling, said as an intent rather than a pixel count |
| Development | Ghostty, zellij, zsh, the editor, Git tooling and language runtimes |
| Windows | Tiling, workspaces, and a launcher on a tap of Caps-Lock |
| Bar | A status bar: workspaces, weather, media, battery, clock |
| Launcher | A ⌘Space command palette where every command is a file |
| Shelf | A file shelf that drops out of the notch to catch drag-drops |
| Focus | One quiet switch: Do Not Disturb, your status, your hooks |
| AI | Coding agents, each with its own checkout of the repo |
| Text expansion | Type a short trigger, get the long thing, in any app |
| Security | Touch ID for sudo, lock behaviour, firewall, secrets |
Underneath them is the foundation nobody switches off: the macOS defaults, the
Homebrew policy and the haus CLI itself. The full
reference lists every option in every room, with
its type and default.
Which rooms are on is your desktop's decision, and disagreeing with it is one line in your host file. Each piece also stands alone: you can take the whole thing, or just pounce, or just the palette.
The shape of a haus machine
Your config lives at ~/.config/nix and it is yours: your name, your keys,
your app list. It imports haus; it never edits it. haus stays upstream, pinned
to an exact commit, and nothing about your machine changes until you run
haus update.
That split is the whole design. Your identity is never in someone else's repo, and their improvements are never a surprise on your machine.
Where to go next
Install
What the one-liner does, how to read it before you run it, and the one command that actually changes the machine.
Choose a desktop
Which rooms this Mac runs, and what the visible choices are: hacker, everyday, minimal, blank, or one of your own.
hacker
The desktop most people install haus by installing: what it turns on, and the first moves that make it click.