aboutsummaryrefslogtreecommitdiff
path: root/macos.local/flake
diff options
context:
space:
mode:
authorjjanzen <jjanzen@jjanzen.ca>2025-03-05 22:17:31 -0600
committerjjanzen <jjanzen@jjanzen.ca>2025-03-05 22:17:31 -0600
commite6edbad14d8255743c7b259a1985db5fb5bd4e91 (patch)
treeab535ebf7942b3935b8ec35158291c09226faf73 /macos.local/flake
parentc1f8c535d59658dd29d199c62326b9436a489ecf (diff)
system changes
Diffstat (limited to 'macos.local/flake')
-rw-r--r--macos.local/flake/flake.lock69
-rw-r--r--macos.local/flake/flake.nix.org34
l---------macos.local/flake/home/.wallpaper1
l---------macos.local/flake/home/clang-format.nix.org1
-rw-r--r--macos.local/flake/home/core.nix.org30
l---------macos.local/flake/home/fonts.nix.org1
-rw-r--r--macos.local/flake/home/programs/.DS_Storebin0 -> 6148 bytes
-rw-r--r--macos.local/flake/home/programs/core.nix.org68
-rw-r--r--macos.local/flake/home/programs/emacs/core.nix.org14
l---------macos.local/flake/home/programs/emacs/early-init.el.org1
l---------macos.local/flake/home/programs/emacs/feed.org.org1
l---------macos.local/flake/home/programs/emacs/init.el.org1
l---------macos.local/flake/home/programs/fastfetch.nix.org1
-rw-r--r--macos.local/flake/home/programs/ghostty.nix.org23
l---------macos.local/flake/home/programs/git.nix.org1
-rw-r--r--macos.local/flake/home/programs/ncmpcpp.nix.org28
l---------macos.local/flake/home/programs/neovim.nix.org1
-rw-r--r--macos.local/flake/home/programs/ssh.nix.org44
-rw-r--r--macos.local/flake/home/programs/zsh/core.nix.org36
-rw-r--r--macos.local/flake/home/programs/zsh/init-extra.sh.org28
-rw-r--r--macos.local/flake/home/programs/zsh/profile-extra.sh.org10
-rw-r--r--macos.local/flake/home/scripts/core.nix.org27
-rw-r--r--macos.local/flake/home/scripts/deploy-website.org7
-rw-r--r--macos.local/flake/home/scripts/launcher.org7
-rw-r--r--macos.local/flake/home/scripts/manage-system.org47
-rw-r--r--macos.local/flake/home/scripts/remove-quarantine.org7
-rw-r--r--macos.local/flake/home/services/core.nix.org12
-rw-r--r--macos.local/flake/home/services/mpd.nix.org49
-rw-r--r--macos.local/flake/system/aerospace.nix.org96
-rw-r--r--macos.local/flake/system/core.nix.org61
-rw-r--r--macos.local/flake/system/homebrew.nix.org118
31 files changed, 824 insertions, 0 deletions
diff --git a/macos.local/flake/flake.lock b/macos.local/flake/flake.lock
new file mode 100644
index 0000000..16fab9e
--- /dev/null
+++ b/macos.local/flake/flake.lock
@@ -0,0 +1,69 @@
+{
+ "nodes": {
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1741128660,
+ "narHash": "sha256-GWaZ+KGxWYbOB15CSqktwngq0ccA1l2Ov3aUfl9jeY4=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "b1b964ea9348aef08cab514fa88e9c99def6fd63",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "nix-darwin": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1741112248,
+ "narHash": "sha256-Y340xoE1Vgo0eCDJi4srVjuwlr50vYSoyJrZeXHw3n0=",
+ "owner": "LnL7",
+ "repo": "nix-darwin",
+ "rev": "991bb2f6d46fc2ff7990913c173afdb0318314cb",
+ "type": "github"
+ },
+ "original": {
+ "owner": "LnL7",
+ "repo": "nix-darwin",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1741037377,
+ "narHash": "sha256-SvtvVKHaUX4Owb+PasySwZsoc5VUeTf1px34BByiOxw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "02032da4af073d0f6110540c8677f16d4be0117f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "home-manager": "home-manager",
+ "nix-darwin": "nix-darwin",
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/macos.local/flake/flake.nix.org b/macos.local/flake/flake.nix.org
new file mode 100644
index 0000000..9a07ccb
--- /dev/null
+++ b/macos.local/flake/flake.nix.org
@@ -0,0 +1,34 @@
+#+title: macOS Nix Configuration
+
+The root for my macOS nix configuration using flake and home-manager.
+#+begin_src nix
+ {
+ description = "My Darwin Configuration";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ nix-darwin.url = "github:LnL7/nix-darwin";
+ nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
+ home-manager.url = "github:nix-community/home-manager";
+ home-manager.inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ outputs = inputs@{ self, nix-darwin, nixpkgs, home-manager }: {
+ darwinConfigurations."macos" = nix-darwin.lib.darwinSystem {
+ specialArgs = { inherit inputs; };
+ modules = [
+ ./system/core.nix
+ home-manager.darwinModules.home-manager
+ {
+ home-manager.backupFileExtension = "bak";
+ home-manager.useGlobalPkgs = false;
+ home-manager.useUserPackages = true;
+ home-manager.users.jjanzen = import ./home/core.nix;
+ }
+ ];
+ };
+
+ darwinPackages = self.darwinConfigurations."macos".pkgs;
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/.wallpaper b/macos.local/flake/home/.wallpaper
new file mode 120000
index 0000000..316db81
--- /dev/null
+++ b/macos.local/flake/home/.wallpaper
@@ -0,0 +1 @@
+../../../common/.wallpaper \ No newline at end of file
diff --git a/macos.local/flake/home/clang-format.nix.org b/macos.local/flake/home/clang-format.nix.org
new file mode 120000
index 0000000..db7166a
--- /dev/null
+++ b/macos.local/flake/home/clang-format.nix.org
@@ -0,0 +1 @@
+../../../common/.flake/home/clang-format.nix.org \ No newline at end of file
diff --git a/macos.local/flake/home/core.nix.org b/macos.local/flake/home/core.nix.org
new file mode 100644
index 0000000..cb2b34d
--- /dev/null
+++ b/macos.local/flake/home/core.nix.org
@@ -0,0 +1,30 @@
+#+title: Home Configuration
+
+Set up home manager for my user account and import submodules. Define my user as =jjanzen= and specify the wallpaper and add items to the =PATH= variable.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ imports = [
+ ./clang-format.nix
+ ./fonts.nix
+ ./programs/core.nix
+ ./scripts/core.nix
+ ./services/core.nix
+ ];
+
+ home.stateVersion = "24.05";
+ programs.home-manager.enable = true;
+
+ home.username = "jjanzen";
+ home.homeDirectory = "/Users/jjanzen";
+
+ home.file.".wallpaper".source = ./.wallpaper;
+
+ home.sessionPath = [
+ "$HOME/.local/bin"
+ "/usr/local/bin"
+ "/opt/homebrew/bin"
+ ];
+ }
+#+end_src
diff --git a/macos.local/flake/home/fonts.nix.org b/macos.local/flake/home/fonts.nix.org
new file mode 120000
index 0000000..53bec1c
--- /dev/null
+++ b/macos.local/flake/home/fonts.nix.org
@@ -0,0 +1 @@
+../../../common/.flake/home/fonts.nix.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/.DS_Store b/macos.local/flake/home/programs/.DS_Store
new file mode 100644
index 0000000..668825b
--- /dev/null
+++ b/macos.local/flake/home/programs/.DS_Store
Binary files differ
diff --git a/macos.local/flake/home/programs/core.nix.org b/macos.local/flake/home/programs/core.nix.org
new file mode 100644
index 0000000..24b2555
--- /dev/null
+++ b/macos.local/flake/home/programs/core.nix.org
@@ -0,0 +1,68 @@
+#+title: Core Program Configuration
+
+Import configurations for programs and install programs with no configuration.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ imports = [
+ ./emacs/core.nix
+ ./fastfetch.nix
+ ./ghostty.nix
+ ./git.nix
+ ./ncmpcpp.nix
+ ./neovim.nix
+ ./ssh.nix
+ ./zsh/core.nix
+ ];
+
+ home.packages = with pkgs; [
+ aescrypt
+ bash-language-server
+ bear
+ bison
+ cmake
+ cmake-language-server
+ curl
+ dos2unix
+ eza
+ ffmpeg
+ fzf
+ gnutls
+ go
+ gopls
+ gpgme
+ htop
+ hunspell
+ hyfetch # TODO: configure
+ inetutils
+ ispell
+ lesspipe
+ marksman
+ mailutils
+ meson
+ mpv
+ ninja
+ nodejs_23
+ notcurses
+ p7zip
+ pandoc
+ python312
+ python312Packages.black
+ python312Packages.pylint
+ python312Packages.python-lsp-server
+ ripgrep
+ rsync
+ rustup
+ shellcheck
+ shfmt
+ texliveFull
+ typescript-language-server
+ vscode-langservers-extracted
+ wget
+ yt-dlp
+ zig
+ zls
+ ];
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/emacs/core.nix.org b/macos.local/flake/home/programs/emacs/core.nix.org
new file mode 100644
index 0000000..2bb4237
--- /dev/null
+++ b/macos.local/flake/home/programs/emacs/core.nix.org
@@ -0,0 +1,14 @@
+#+title: Emacs Configuration
+
+Here is my Emacs configuration. This file just defines configurations that should exist. Emacs is installed with Homebrew.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ home.file = {
+ "./.config/emacs/early-init.el".source = ./early-init.el;
+ "./.config/emacs/feed.org".source = ./feed.org;
+ "./.config/emacs/init.el".source = ./init.el;
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/emacs/early-init.el.org b/macos.local/flake/home/programs/emacs/early-init.el.org
new file mode 120000
index 0000000..7c20436
--- /dev/null
+++ b/macos.local/flake/home/programs/emacs/early-init.el.org
@@ -0,0 +1 @@
+../../../../../common/.config/emacs/early-init.el.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/emacs/feed.org.org b/macos.local/flake/home/programs/emacs/feed.org.org
new file mode 120000
index 0000000..d074855
--- /dev/null
+++ b/macos.local/flake/home/programs/emacs/feed.org.org
@@ -0,0 +1 @@
+../../../../../common/.config/emacs/feed.org.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/emacs/init.el.org b/macos.local/flake/home/programs/emacs/init.el.org
new file mode 120000
index 0000000..6b2f721
--- /dev/null
+++ b/macos.local/flake/home/programs/emacs/init.el.org
@@ -0,0 +1 @@
+../../../../../common/.config/emacs/init.el.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/fastfetch.nix.org b/macos.local/flake/home/programs/fastfetch.nix.org
new file mode 120000
index 0000000..25e2716
--- /dev/null
+++ b/macos.local/flake/home/programs/fastfetch.nix.org
@@ -0,0 +1 @@
+../../../../common/.flake/home/programs/fastfetch.nix.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/ghostty.nix.org b/macos.local/flake/home/programs/ghostty.nix.org
new file mode 100644
index 0000000..29bc15a
--- /dev/null
+++ b/macos.local/flake/home/programs/ghostty.nix.org
@@ -0,0 +1,23 @@
+#+title: ghostty Configuration
+
+I use =ghostty= as a terminal emulator on macOS. I disable auto-update and set some sensible options.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ home.file."./.config/ghostty/config".text = ''
+ auto-update = "off"
+ background-blur-radius = 20
+ background-opacity = 0.8
+ clipboard-trim-trailing-spaces = true
+ font-family = "SauceCodePro Nerd Font"
+ font-thicken = true
+ macos-option-as-alt = true
+ macos-window-shadow = false
+ mouse-hide-while-typing = true
+ quit-after-last-window-closed = true
+ theme = "Builtin Light"
+ window-decoration = true
+ '';
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/git.nix.org b/macos.local/flake/home/programs/git.nix.org
new file mode 120000
index 0000000..e8ddd28
--- /dev/null
+++ b/macos.local/flake/home/programs/git.nix.org
@@ -0,0 +1 @@
+../../../../common/.flake/home/programs/git.nix.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/ncmpcpp.nix.org b/macos.local/flake/home/programs/ncmpcpp.nix.org
new file mode 100644
index 0000000..6c697ef
--- /dev/null
+++ b/macos.local/flake/home/programs/ncmpcpp.nix.org
@@ -0,0 +1,28 @@
+#+title: =ncmpcpp= Configuration
+
+Enable =vi=-like controls and specify directories and =mpd= address.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ programs.ncmpcpp = {
+ enable = true;
+ bindings = [
+ { key = "j"; command = "scroll_down"; }
+ { key = "k"; command = "scroll_up"; }
+ { key = "h"; command = "previous_column"; }
+ { key = "l"; command = "next_column"; }
+ { key = "g"; command = "move_home"; }
+ { key = "G"; command = "move_end"; }
+ { key = "n"; command = "next_found_item"; }
+ { key = "N"; command = "previous_found_item"; }
+ ];
+ mpdMusicDir = "/Volumes/Media/Music";
+ settings = {
+ ncmpcpp_directory = "~/.config/nmcpcpp";
+ mpd_host = "localhost";
+ mpd_port = "6600";
+ };
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/neovim.nix.org b/macos.local/flake/home/programs/neovim.nix.org
new file mode 120000
index 0000000..871eafa
--- /dev/null
+++ b/macos.local/flake/home/programs/neovim.nix.org
@@ -0,0 +1 @@
+../../../../common/.flake/home/programs/neovim.nix.org \ No newline at end of file
diff --git a/macos.local/flake/home/programs/ssh.nix.org b/macos.local/flake/home/programs/ssh.nix.org
new file mode 100644
index 0000000..28f779f
--- /dev/null
+++ b/macos.local/flake/home/programs/ssh.nix.org
@@ -0,0 +1,44 @@
+#+title: SSH Configuration
+
+Configure SSH. Keys should be added to the SSH agent. Use the system keychain on all configurations.
+#+begin_src nix
+ { config, pkgs, ... }:
+ {
+ programs.ssh = {
+ enable = true;
+ addKeysToAgent = "yes";
+ matchBlocks = {
+ "*" = {
+ identityFile = "~/.ssh/id_ed25519";
+ extraOptions = {
+ "UseKeychain" = "yes";
+ };
+ };
+
+ "aviary" = {
+ hostname = "aviary.cs.umanitoba.ca";
+ user = "janzenj2";
+ setEnv = {
+ "TERM" = "xterm";
+ };
+ };
+
+ "jjanzen.ca" = {
+ setEnv = {
+ "TERM" = "xterm";
+ };
+ };
+
+ "oracle" = {
+ setEnv = {
+ "TERM" = "xterm";
+ };
+ hostname = "jjanzen.ca";
+ identityFile = "~/.ssh/oracle";
+ identitiesOnly = true;
+ user = "opc";
+ };
+ };
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/zsh/core.nix.org b/macos.local/flake/home/programs/zsh/core.nix.org
new file mode 100644
index 0000000..84e9aff
--- /dev/null
+++ b/macos.local/flake/home/programs/zsh/core.nix.org
@@ -0,0 +1,36 @@
+#+title: ZSH Configuration
+
+Open =zsh= configuration.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ programs.zsh = {
+ enable = true;
+
+ autocd = true;
+
+ autosuggestion.enable = true;
+
+ defaultKeymap = "emacs";
+
+ history = {
+ append = true;
+ ignoreAllDups = true;
+ };
+
+ shellAliases = {
+ "ll" = "ls -alF";
+ "la" = "ls -a";
+ "l" = "ls -F";
+ "sl" = "ls";
+ };
+
+ syntaxHighlighting.enable = true;
+
+ initExtra = builtins.readFile ./init-extra.sh;
+
+ profileExtra = builtins.readFile ./profile-extra.sh;
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/programs/zsh/init-extra.sh.org b/macos.local/flake/home/programs/zsh/init-extra.sh.org
new file mode 100644
index 0000000..8255ce1
--- /dev/null
+++ b/macos.local/flake/home/programs/zsh/init-extra.sh.org
@@ -0,0 +1,28 @@
+#+title: ZSH Extra Initialization Code
+
+Define optional aliases.
+#+begin_src sh
+ which lesspipe.sh &> /dev/null && export LESSOPEN="|lesspipe.sh %s"
+ which eza &> /dev/null && alias ls=eza
+#+end_src
+
+Enable =fzf= extensions for =zsh=.
+#+begin_src sh
+ which zsh &> /dev/null && source <(fzf --zsh)
+#+end_src
+
+Enable git status in =zsh= prompt.
+#+begin_src sh
+ parse_git_dirty() {
+ git_status="$(git status 2> /dev/null)"
+ [[ "$git_status" =~ "use \"git push\" to publish your local commits" ]] && echo -n " %F{green}%f"
+ [[ "$git_status" =~ "Changes to be committed:" ]] && echo -n " %F{magenta}%f"
+ [[ "$git_status" =~ "Changes not staged for commit:" ]] && echo -n " %F{yellow}%f"
+ [[ "$git_status" =~ "Untracked files:" ]] && echo -n " %F{red}%f"
+ }
+ setopt prompt_subst
+ autoload -Uz vcs_info
+ precmd () { vcs_info }
+ zstyle ':vcs_info:*' formats ' %F{blue}%b%f' # git(main)
+ PS1='%(?..%B%F{red}[%?%\]%f%b )%F{green}%20<...<%~%<<%f$vcs_info_msg_0_$(parse_git_dirty) $ '
+#+end_src
diff --git a/macos.local/flake/home/programs/zsh/profile-extra.sh.org b/macos.local/flake/home/programs/zsh/profile-extra.sh.org
new file mode 100644
index 0000000..64457ed
--- /dev/null
+++ b/macos.local/flake/home/programs/zsh/profile-extra.sh.org
@@ -0,0 +1,10 @@
+#+title: Profile Extra Code
+
+Enable =ssh-agent= at login.
+#+begin_src sh
+ if [ ! -S ~/.ssh/ssh_auth_sock ]; then
+ eval `ssh-agent` > /dev/null
+ ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
+ fi
+ export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
+#+end_src
diff --git a/macos.local/flake/home/scripts/core.nix.org b/macos.local/flake/home/scripts/core.nix.org
new file mode 100644
index 0000000..f3fd314
--- /dev/null
+++ b/macos.local/flake/home/scripts/core.nix.org
@@ -0,0 +1,27 @@
+#+title: Custom Scripts
+
+Import various scripts useful on my system.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ home.file = {
+ "./.local/bin/deploy-website" = {
+ executable = true;
+ source = ./deploy-website;
+ };
+ "./.local/bin/launcher" = {
+ executable = true;
+ source = ./launcher;
+ };
+ "./.local/bin/remove-quarantine" = {
+ executable = true;
+ source = ./remove-quarantine;
+ };
+ "./.local/bin/manage-system" = {
+ executable = true;
+ source = ./manage-system;
+ };
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/home/scripts/deploy-website.org b/macos.local/flake/home/scripts/deploy-website.org
new file mode 100644
index 0000000..76e5d54
--- /dev/null
+++ b/macos.local/flake/home/scripts/deploy-website.org
@@ -0,0 +1,7 @@
+#+title: Website Deploy Script
+
+Deploy my website from a specified branch by using =ssh= to get into my server and running the deploy script, passing command line arguments to the script.
+#+begin_src sh
+ #!/bin/sh
+ /usr/bin/ssh jjanzen.ca "sudo /usr/local/bin/deploy.sh "$@""
+#+end_src
diff --git a/macos.local/flake/home/scripts/launcher.org b/macos.local/flake/home/scripts/launcher.org
new file mode 100644
index 0000000..0063bf1
--- /dev/null
+++ b/macos.local/flake/home/scripts/launcher.org
@@ -0,0 +1,7 @@
+#+title: Launcher Script
+
+Use =choose-gui= to launch an application. This is used for a keyboard command to launch applications.
+#+begin_src sh
+ #!/bin/sh
+ open -n $(find -L /Applications /System/Applications /System/Applications/Utilities ~/Applications /opt/homebrew/opt/emacs-plus@* -maxdepth 1 -name "*.app" | choose -f "SauceCodePro Nerd Font" -s 15)
+#+end_src
diff --git a/macos.local/flake/home/scripts/manage-system.org b/macos.local/flake/home/scripts/manage-system.org
new file mode 100644
index 0000000..e8da0d9
--- /dev/null
+++ b/macos.local/flake/home/scripts/manage-system.org
@@ -0,0 +1,47 @@
+#+title: System Management Script
+
+#+begin_src sh
+ #!/bin/sh
+
+ usage ()
+ {
+ echo "Usage: $0 [command] where command is one of"
+ echo "help - show this message and exit"
+ echo "backup - push the configuration to the remote"
+ echo "update - update the system"
+ echo "install - install the system configurations"
+ }
+
+ [ "$#" -eq 0 ] && usage && exit 1
+
+ dir="$pwd"
+ cd ~/.dotfiles || exit 1
+
+ case "$1" in
+ help)
+ usage
+ cd "$dir" || exit 1
+ exit 0
+ ;;
+ backup)
+ git push
+ cd "$dir" || exit 1
+ exit 0
+ ;;
+ update)
+ make update
+ cd "$dir" || exit 1
+ exit 0
+ ;;
+ install)
+ make install
+ cd "$dir" || exit 1
+ exit 0
+ ;;
+ ,*)
+ usage
+ cd "$dir" || exit 1
+ exit 1
+ ;;
+ esac
+#+end_src
diff --git a/macos.local/flake/home/scripts/remove-quarantine.org b/macos.local/flake/home/scripts/remove-quarantine.org
new file mode 100644
index 0000000..373c503
--- /dev/null
+++ b/macos.local/flake/home/scripts/remove-quarantine.org
@@ -0,0 +1,7 @@
+#+title: Remove Quarantine
+
+macOS likes putting applications in quarantine without me wanting. This script removes an application from the quarantine. Remove the app from quarantine by recursively deleting the quarantine attribute on the application.
+#+begin_src sh
+ #!/bin/sh
+ /usr/bin/xattr -dr com.apple.quarantine "$@"
+#+end_src
diff --git a/macos.local/flake/home/services/core.nix.org b/macos.local/flake/home/services/core.nix.org
new file mode 100644
index 0000000..d504770
--- /dev/null
+++ b/macos.local/flake/home/services/core.nix.org
@@ -0,0 +1,12 @@
+#+title: Service Configuration
+
+Load service configurations.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ imports = [
+ ./mpd.nix
+ ];
+ }
+#+end_src
diff --git a/macos.local/flake/home/services/mpd.nix.org b/macos.local/flake/home/services/mpd.nix.org
new file mode 100644
index 0000000..f3f7f8b
--- /dev/null
+++ b/macos.local/flake/home/services/mpd.nix.org
@@ -0,0 +1,49 @@
+#+title: =mpd= Configuration
+
+Configure =mpd= as a music player. =services.mpd= only works on Linux for some reason so I manually write out the configuration here. This is actually a really gross setup and requires manually creating files in =.mpd= and manually starting =mpd=, but it does seem to work at least.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ home.packages = with pkgs; [
+ mpd
+ ];
+ home.file."./.mpdconf".text = ''
+ music_directory "/Volumes/Media/Music"
+ playlist_directory "~/.mpd/playlists"
+ db_file "~/.mpd/mpd.db"
+ log_file "~/.mpd/mpd.log"
+ pid_file "~/.mpd/mpd.pid"
+ state_file "~/.mpd/mpdstate"
+ auto_update "yes"
+ auto_update_depth "2"
+ follow_outside_symlinks "yes"
+ follow_inside_symlinks "yes"
+
+ audio_output {
+ type "osx"
+ name "CoreAudio"
+ mixer_type "software"
+ }
+
+ decoder {
+ plugin "mp4ff"
+ enabled "no"
+ }
+
+ bind_to_address "127.0.0.1"
+ port "6600"
+ user "jjanzen"
+
+ # Visualizer
+ audio_output {
+ type "fifo"
+ name "my_fifo"
+ path "/tmp/mpd.fifo"
+ format "44100:16:2"
+ auto_resample "no"
+ use_mmap "yes"
+ }
+ '';
+ }
+#+end_src
diff --git a/macos.local/flake/system/aerospace.nix.org b/macos.local/flake/system/aerospace.nix.org
new file mode 100644
index 0000000..a0c72df
--- /dev/null
+++ b/macos.local/flake/system/aerospace.nix.org
@@ -0,0 +1,96 @@
+#+title: Aerospace Configuration
+
+Enable Aerospace as a window manager for macOS. I have disabled gaps, move the mouse to follow windows, and an =i3=-like binding configuration.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ services.aerospace = {
+ enable = true;
+ settings = {
+ gaps = {
+ outer.left = 0;
+ outer.bottom = 0;
+ outer.top = 0;
+ outer.right = 0;
+ };
+ on-focus-changed = [
+ "move-mouse window-lazy-center"
+ ];
+ on-window-detected = [
+ {
+ "if".app-name-regex-substring = "mpv";
+ run = [
+ "layout floating"
+ ];
+ }
+ ];
+ workspace-to-monitor-force-assignment = {
+ "1" = "main";
+ "2" = "main";
+ "3" = "main";
+ "4" = "main";
+ "5" = "main";
+ "6" = "main";
+ "7" = "main";
+ "8" = "main";
+ "9" = [
+ "secondary"
+ "dell"
+ ];
+ "10" = [
+ "secondary"
+ "built-in"
+ ];
+ };
+ mode.main.binding = {
+ cmd-enter = "exec-and-forget open -n /Applications/Ghostty.app/";
+ cmd-shift-enter = "exec-and-forget /opt/homebrew/bin/emacs";
+ cmd-d = "exec-and-forget ~/.local/bin/launcher";
+ cmd-shift-f = "fullscreen";
+ cmd-shift-space = "layout floating tiling";
+
+ cmd-h = "focus --boundaries-action wrap-around-the-workspace left";
+ cmd-j = "focus --boundaries-action wrap-around-the-workspace down";
+ cmd-k = "focus --boundaries-action wrap-around-the-workspace up";
+ cmd-l = "focus --boundaries-action wrap-around-the-workspace right";
+
+ cmd-shift-h = "move left";
+ cmd-shift-j = "move down";
+ cmd-shift-k = "move up";
+ cmd-shift-l = "move right";
+
+ cmd-shift-minus = "resize smart -50";
+ cmd-shift-equal = "resize smart +50";
+
+ cmd-1 = "workspace 1";
+ cmd-2 = "workspace 2";
+ cmd-3 = "workspace 3";
+ cmd-4 = "workspace 4";
+ cmd-5 = "workspace 5";
+ cmd-6 = "workspace 6";
+ cmd-7 = "workspace 7";
+ cmd-8 = "workspace 8";
+ cmd-9 = "workspace 9";
+ cmd-0 = "workspace 10";
+
+ cmd-shift-1 = "move-node-to-workspace 1";
+ cmd-shift-2 = "move-node-to-workspace 2";
+ cmd-shift-3 = "move-node-to-workspace 3";
+ cmd-shift-4 = "move-node-to-workspace 4";
+ cmd-shift-5 = "move-node-to-workspace 5";
+ cmd-shift-6 = "move-node-to-workspace 6";
+ cmd-shift-7 = "move-node-to-workspace 7";
+ cmd-shift-8 = "move-node-to-workspace 8";
+ cmd-shift-9 = "move-node-to-workspace 9";
+ cmd-shift-0 = "move-node-to-workspace 10";
+
+ cmd-ctrl-shift-h = "join-with left";
+ cmd-ctrl-shift-j = "join-with down";
+ cmd-ctrl-shift-k = "join-with up";
+ cmd-ctrl-shift-l = "join-with right";
+ };
+ };
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/system/core.nix.org b/macos.local/flake/system/core.nix.org
new file mode 100644
index 0000000..18ca960
--- /dev/null
+++ b/macos.local/flake/system/core.nix.org
@@ -0,0 +1,61 @@
+#+title: System Core
+
+This file imports various system configuration components in addition to enabling flakes and defining the system version.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ let
+ inherit (pkgs) aspellWithDicts;
+ myaspell = aspellWithDicts (d: [d.en d.en-computers d.en-science]);
+ in {
+ imports = [
+ ./aerospace.nix
+ ./homebrew.nix
+ ];
+
+ # Unfortunately, I sometimes need unfree packages
+ nixpkgs.config.allowUnfree = true;
+
+ # Install a small number of packages for root
+ environment.systemPackages = with pkgs; [
+ gnupg
+ myaspell
+ neovim
+ ];
+
+ # Use TouchID for sudo
+ security.pam.services.sudo_local.touchIdAuth = true;
+
+ # Open text files in neovim by default
+ environment.variables.EDITOR = "nvim";
+
+ # Enable nix packages
+ nix.package = pkgs.nix;
+
+ programs.gnupg.agent.enable = false;
+
+ # Use flakes
+ nix.settings.experimental-features = "nix-command flakes";
+
+ # Use zsh as my shell
+ programs.zsh.enable = true;
+
+ # Enable documentation and make
+ documentation = {
+ enable = true;
+ info.enable = true;
+ man.enable = true;
+ };
+
+ system.stateVersion = 5;
+
+ # Use ARM64 packages
+ nixpkgs.hostPlatform = "aarch64-darwin";
+
+ # Define my user
+ users.users.jjanzen = {
+ name = "jjanzen";
+ home = "/Users/jjanzen";
+ };
+ }
+#+end_src
diff --git a/macos.local/flake/system/homebrew.nix.org b/macos.local/flake/system/homebrew.nix.org
new file mode 100644
index 0000000..6a65114
--- /dev/null
+++ b/macos.local/flake/system/homebrew.nix.org
@@ -0,0 +1,118 @@
+#+title: Homebrew Configuration
+
+Set up Homebrew. I disable the quarantine automatically and ensure that the state of Homebrew is exactly as specified here.
+#+begin_src nix
+ { config, pkgs, ... }:
+
+ {
+ homebrew = {
+ enable = true;
+
+ caskArgs.no_quarantine = true;
+
+ global.autoUpdate = false;
+ onActivation = {
+ autoUpdate = true;
+ cleanup = "zap";
+ upgrade = true;
+ };
+
+ taps = [
+ "camillescholtz/formulae"
+ "d12frosted/emacs-plus"
+ "homebrew/bundle"
+ "homebrew/cask-fonts"
+ "homebrew/cask-versions"
+ "homebrew/services"
+ "jorgelbg/tap"
+ "osx-cross/avr"
+ ];
+
+ brews = [
+ # emacs is handled better by homebrew on mac
+ {
+ name = "emacs-plus@30";
+ args = [
+ "with-native-comp"
+ "with-imagemagick"
+ "with-xwidgets"
+ "with-mailutils"
+ "with-ctags"
+ "with-retro-emacs-logo-icon"
+ ];
+ }
+
+ # problematic nix builds
+ "choose-gui" # nix version fails to build
+ "clang-format" # nix version screws up clang setup
+ "openjdk" # there's really no jdk for mac from nix?
+ "pinentry-touchid" # no nix version
+
+ # need for grading purposes
+ "avrdude"
+ "open-mpi"
+ "open-ocd"
+ "osx-cross/avr/avr-binutils"
+ "osx-cross/avr/avarice"
+ "osx-cross/avr/avr-gcc@14"
+
+ # needed for pdf-tools for emacs
+ "autoconf"
+ "automake"
+ "pkg-config"
+ "poppler"
+
+ # required by emacs-plus@30
+ "imagemagick"
+ "jansson"
+ "jpeg"
+ "libgccjit"
+ "librsvg"
+ "zlib"
+
+ "mailutils"
+ "tree-sitter"
+
+ # required by pinentry-touchid
+ "libassuan@2"
+ "gnupg"
+ "pinentry-mac"
+ ];
+
+ # homebrew handles graphical applications better than nix
+ casks = [
+ "audacity"
+ "blender"
+ "cabal"
+ "calibre"
+ "desmume"
+ "discord"
+ "dwarf-fortress-lmp"
+ "firefox"
+ "gcc-arm-embedded"
+ "ghostty"
+ "gimp"
+ "godot"
+ "gzdoom"
+ "inkscape"
+ "krita"
+ "librewolf"
+ "multimc"
+ "obs"
+ "openemu"
+ "openmw"
+ "pokemon-showdown"
+ "proton-mail-bridge"
+ "protonvpn"
+ "qbittorrent"
+ "rar"
+ "syncthing"
+ "thunderbird"
+ "tor-browser"
+ "vlc"
+ "whisky"
+ "zotero"
+ ];
+ };
+ }
+#+end_src