Nix configurations for my personal systems.
Find a file
2026-01-03 00:47:05 -05:00
.github/workflows initial 2025-12-24 03:15:43 -05:00
blueprints vorta/borg + other smaller apps and tweaks 2025-12-25 02:43:58 -08:00
hosts/acyltransferase direnv + tabby 2026-01-03 00:47:05 -05:00
users/dani direnv + tabby 2026-01-03 00:47:05 -05:00
.gitignore testing 2025-12-25 01:09:19 -08:00
flake.lock vorta/borg + other smaller apps and tweaks 2025-12-25 02:43:58 -08:00
flake.nix vorta/borg + other smaller apps and tweaks 2025-12-25 02:43:58 -08:00
README.md initial 2025-12-24 03:15:43 -05:00

This is a boilerplate for someone wanting to build a Nix-Darwin flake.

This is intended to be used as a starting point, so it would make most sense, to create a new template from this repository and modify it to fit your needs.

Features:

Codifies the following settings (in no particular order):

Requirements:

Quickstart:

Assuming you want to build the m2-macbook-air output, you'd use these commands:

git clone https://github.com/heywoodlh/nix-darwin-flake
cd nix-darwin-flake
darwin-rebuild switch --flake .#m2-macbook-air

Making this your own:

First, create a new repository using this repository as your template, using the following link:

https://github.com/heywoodlh/nix-darwin-flake/generate

Create a new MacOS configuration/output for your own machine in the darwinConfigurations section in flake.nix. Suppose that we wanted to name this output mac-mini, we would create an output in the darwinConfigurations section like this:

      # M1 mac-mini
      "mac-mini" = darwin.lib.darwinSystem {
        system = "aarch64-darwin";
        specialArgs = inputs;
        modules = [ ./hosts/mac-mini.nix ];
      };

Then, create a new file in ./hosts/mac-mini.nix with the following configuration (modify the hostname and username variables in the let section to match your desired values):

{ config, pkgs, lib, home-manager, nur, ... }:

let
  hostname = "mac-mini";
  username = "heywoodlh";
in {
  imports = [
    ../blueprints/m1.nix
    ../blueprints/defaults.nix
    ../blueprints/brew.nix
    ../blueprints/yabai.nix
    ../blueprints/network.nix
    ../blueprints/home-manager/settings.nix
  ];
  # Define user settings
  users.users.${username} = import ../blueprints/user.nix { inherit config; inherit pkgs; };

  # Set home-manager configs for username
  home-manager.users.${username} = import ../blueprints/home-manager/user.nix;

  # Set hostname
  networking.hostName = "${hostname}";

  system.stateVersion = 6;
}

Once your configuration is set, you can switch to the new mac-mini output with these commands (while in the root directory of this repository):

darwin-rebuild switch --flake .#mac-mini

Once your configuration is working, start modifying your new repository with your desired Nix-Darwin settings! Here are some resources for getting started:

Note: The way this repository is built, any Nix-Darwin settings you want shared or to be re-used between your outputs should go in the blueprints folder and any Nix-Darwin configuration settings that are specific to a single machine should go in its corresponding file in the hosts folder.

What is a Nix Flake and how does it work?

A Nix flake is a self-contained Nix configuration. In this case, we're building Nix-Darwin configurations, which allow a user to configure MacOS.

The flake.nix file consists of two parts, inputs and outputs. Inputs are resources that will be utilized by the outputs. Outputs are build targets -- in this case, our outputs are MacOS builds. This Flake is designed with the intention that each MacOS you manage should have its own output.

The anatomy of this Flake

Inputs

Inputs are resources that will be utilized by the build. In this Flake, we're using the following external resources to build the configuration for the machine:

This snippet shows all of the inputs in the Flake:

...
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
    darwin.url = "github:LnL7/nix-darwin/master";
    darwin.inputs.nixpkgs.follows = "nixpkgs";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    nur.url = "github:nix-community/NUR";
  };
...

Outputs (build targets)

Each MacOS build is an output in flake.nix. This repository comes with two outputs/MacOS builds:

  • m2-macbook-air: an example build for settings required for an M2 Macbook Air
  • intel-macbook: an example build for settings required for an Intel Macbook

Each output/MacOS build has a corresponding file in ./hosts where configurations should be imported from the ./blueprints directory. Any specific configuration for a particular machine should live in its file in the ./hosts directory.

This snippet from flake.nix shows the Flake's output named m2-macbook-air and its corresponding config file ./hosts/m2-macbook-air.nix being imported:

  ...
  outputs = inputs@{ self, nixpkgs, darwin, home-manager, jovian-nixos, nur, ... }: {
    darwinConfigurations = {
      # m1-macbook 
      "m2-macbook-air" = darwin.lib.darwinSystem {
        system = "aarch64-darwin";
        specialArgs = inputs;
        modules = [ ./hosts/m2-macbook-air.nix ];
      };
  ...

In ./hosts/m2-macbook-air.nix, we can define which configurations we want to select from the [./blueprints](./blueprints) directory, for example:

...
  imports = [
    ../blueprints/m1.nix
    ../blueprints/defaults.nix
    ../blueprints/brew.nix
    ../blueprints/yabai.nix
    ../blueprints/network.nix
    ../blueprints/home-manager/settings.nix
  ];
...

Blueprints:

Currently, the Flake contains the following example configurations that are in the ./blueprints directory (listed in no particular order):