#+title: dotfiles.nix

My dotfiles using Nix.
System configuration done using [[https://github.com/LnL7/nix-darwin][nix-darwin]] and [[https://nixos.org/][NixOS]].
User configuration using [[https://github.com/nix-community/home-manager][home-manager]].
This repo is put together as a flake using [[https://github.com/hercules-ci/flake-parts][flake-parts]].

Much of the structure of dotfiles.nix is taken from [[https://github.com/terlar/nix-config/tree/main][terlar/nix-config]] with other ideas taken from [[https://sr.ht/~rycee/configurations/][~rycee/configurations]].
Another notable info source is [[https://github.com/hlissner/dotfiles][hlissner/dotfiles]].

All Nix code in this repo is formatted using [[https://github.com/kamadorueda/alejandra][alejandra]].

* Usage

Show what this flake provides:

#+begin_src shell
nix flake show
#+end_src

Switch both system (NixOS) and home:

#+begin_src shell
nix run .#nixos-switch
#+end_src

Switch both system (nix-darwin) and home:

#+begin_src shell
nix run .#darwin-switch
#+end_src

Switch home only:

#+begin_src shell
nix run .#home-switch
#+end_src

Build home without switching:

#+begin_src shell
nix run .#home-switch
#+end_src

Update all inputs:

#+begin_src shell
nix flake update --commit-lock-file
#+end_src

Update a single input:

#+begin_src shell
nix flake lock --update-input nixpkgs --commit-lock-file
#+end_src

Format all nix files:

#+begin_src shell
nix fmt
#+end_src

Enter the dev shell (if not using [[https://github.com/nix-community/nix-direnv][nix-direnv]]):

#+begin_src
nix develop
#+end_src

* Outputs

** Home Configurations

Due to the way the ~homeConfigurations~ output is structured (each user configuration is generated for each system,) the ~home-manager switch --flake~ command cannot be used as per usual, instead the ~FLAKE_CONFIG_URI~ variable needs to be set. See [[./apps/home-switch.nix]] for an example.

All home configurations are exposed under both ~packages.SYSTEM.home-USER~ and ~homeConfiguration.SYSTEM.USER~.

** Apps

These packages make some operations simpler or more intuitive, to use an app, run the following command from within the flake directory: ~nix run .#APPNAME~.

*** darwin-switch

Build and switch to the nix-darwin configuration for the current host (only on Darwin.)
The configuration is defined under ~darwinConfigurations.HOSTNAME~.

*** nixos-switch

Build and switch to the nixos configuration for the current host (only on NixOS.)
The configurations are defined under ~nixosConfigurations.HOSTNAME~.

*** home-switch & home-build

Build and or switch to the home-manager configuration for the current user.
Home configurations are defined under ~homeConfigurations.SYSTEM.USER~.

** Packages

This flake exposes several package definitions I have created, most of them are binary sourced applications for macOS, most importantly Firefox.

** Darwin Configurations

System configurations for macOS.

*** zeus

My primary computer.

** NixOS Configurations

System configurations for NixOS.

*** zeusvm

Linux VM for my macOS machine (~darwinConfigurations.zeus~).

*** zeusasahi

NixOS configuration for my M1 MacBook Pro, uses [[https://github.com/tpwrules/nixos-apple-silicon][tpwrules/nixos-apple-silicon]].
Currently untested, WIP.

** NixOS Modules

Modules for NixOS configurations, most of these should also work for Darwin.

*** custom-linkNixInputs

Adds the inputs of this flake to the nix registry and ~NIX_PATH~.

Taken from [[https://github.com/LnL7/nix-darwin/issues/277#issuecomment-992866471][LnL7/nix-darwin #277]].

* Tasks

** TODO Packages for different systems

Packages are in the flake outputs for systems they are not compatible with.

** TODO Break out emacs config

Emacs configuration should be in it's own repository.
Lisp code should be extracted into separate files or an org-babel setup.

** TODO Test zeusasahi

** TODO Services as modules

Services should be converted to modules.
These should ideally support both linux and darwin hosts (launchd and systemd).
