Skip to content

How the flakes fit together

nebelhaus is built on Nix flakes. You don’t need to understand Nix deeply to use the rice, but knowing how the pieces fit makes the update / rebuild model click — and it’s essential if you want to contribute.

The installer scaffolds ~/.config/nix as a thin consumer of the rice. Its flake.nix imports nebelhaus as an input and calls the mkNebelhaus builder:

{
inputs.nebelhaus.url = "github:nebelhaus/nebelhaus";
outputs = { nebelhaus, ... }: {
darwinConfigurations.<hostname> = nebelhaus.mkNebelhaus {
username = "<user>";
hostname = "<hostname>";
host = ./hosts/<hostname>;
};
};
}

All your personal choices live in hosts/<hostname>/default.nix — your options, your app roster, your casks. The rice stays upstream; you never edit it directly.

mkNebelhaus is the rice’s entry point. Given a username, hostname, and host file, it returns a full darwin-darwinSystem with every room wired up:

nebelhaus.mkNebelhaus {
username = "ada";
hostname = "fog";
host = ./hosts/fog; # your identity + choices
system = "aarch64-darwin"; # Apple Silicon only
extraModules = [ ]; # extra nix-darwin modules, optional
}

It composes the rooms — den, theme, hearth, prowl, sill, collar, pounce, trill, perch, hush, secrets — and layers in home-manager, the nebelung theme, and the pounce app. Most rooms are also exported individually under darwinModules (den, hearth, prowl, sill, collar, pounce, hush, secrets, and default for all of them) if you’d rather cherry-pick; theme, trill, and perch ride along only with the full house.

The rice flake pulls together:

  • nixpkgs (unstable) — the package set
  • nix-darwin — macOS system modules
  • home-manager — your user environment
  • catppuccin — the theme framework
  • nebelung — the silver-mist palette (a family input)
  • pounce — the launcher app (a family input)
  • trill — the Messages client (a family input; tracks trill releases, not main)
  • perch — the notch file shelf (a family input; tracks perch releases, not main)
  • nix-index-database — for nix-index + comma

Why pins mean “nothing changes until you say so”

Section titled “Why pins mean “nothing changes until you say so””

Each input is recorded in flake.lock as an exact commit hash, not “latest”. That’s what makes a rebuild reproducible — the same lock produces the same system on any machine, any day.

The flip side, and the thing that surprises everyone: pushing a change to nebelung or the rice changes nothing on your machine until your flake.lock is bumped to point at the new commit. A colour change therefore ripples like this across the family:

one colour change rippling down the chain: nebelung → pounce → nebelhaus → ~/.config/nix → your Mac, each lock pinning the exact commit of the one before

One subtlety worth knowing if you ever debug a login issue: Determinate Nix lives on a separate APFS volume, and macOS sometimes tries to launch the rice’s GUI agents (AeroSpace, SketchyBar, Pounce) before that volume mounts or before the GUI event manager is ready. The rice wraps each agent in a small gui-wait shim that polls for Dock/Finder/SystemUIServer readiness before exec’ing — which is why your bar and tiling reliably come back after a reboot.