- Nix 100%
| .github/workflows | ||
| blueprints | ||
| hosts/acyltransferase | ||
| users/dani | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
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):
- Basic user configuration in blueprints/user.nix
- Installed applications with
brewin blueprints/brew.nix - Tiling windows and custom keyboard shortcuts with Yabai and SKHD in blueprints/yabai.nix
- Firefox configuration with Home-Manager in blueprints/home-manager/user.nix:
- Default Firefox profile named
default:github.com/heywoodlh/nix-darwin-flake@c4f90bdf0d/blueprints/home-manager/user.nix (L10-L121) - Better Firefox privacy tweaks:
github.com/heywoodlh/nix-darwin-flake@c4f90bdf0d/blueprints/home-manager/user.nix (L70-L121) - Minimal Firefox appearance tweaks with UserChrome.css:
github.com/heywoodlh/nix-darwin-flake@c4f90bdf0d/blueprints/home-manager/user.nix (L25-L67) - Installed Firefox Extensions with NUR:
github.com/heywoodlh/nix-darwin-flake@c4f90bdf0d/blueprints/home-manager/user.nix (L13-L24)
- Default Firefox profile named
- Other various settings in blueprints
Requirements:
- Relatively modern MacOS version
- Nix installed: https://nixos.org/download.html#nix-install-macos
- Nix-Darwin installed: https://github.com/LnL7/nix-darwin#install
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:
- Nix-Darwin configuration options: https://daiderd.com/nix-darwin/manual/index.html#sec-options
- Home-Manager configuration options (for stuff contained in the blueprints/home-manager folder): https://nix-community.github.io/home-manager/options.html
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:
nixpkgsfor Nix packages: https://github.com/nixos/nixpkgsnix-darwinfor managing MacOS: https://github.com/LnL7/nix-darwinhome-managerfor managing various configurations, such as Firefox preferences and plugins: https://github.com/nix-community/home-managernurfor downloading community packages, specifically for downloading Firefox plugins: https://github.com/nix-community/NUR
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 Airintel-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):
- User settings: ./blueprints/users
- Configuring preferred MacOS settings: ./blueprints/defaults.nix
- Homebrew packages and settings: ./blueprints/brew.nix
- Some network settings: ./blueprints/network.nix
- Yabai and SKHD for tiling windows: ./blueprints/yabai.nix
- Some settings for M1/M2 devices: ./blueprints/m1.nix
- Home-Manager configurations: ./blueprints/home-manager