{ host }:
{
  pkgs,
  lib,
  config,
  ...
}:
{
  # https://nix-community.github.io/home-manager
  home.stateVersion = "25.05";
  programs.home-manager.enable = true;

  home.username = host.username;
  home.homeDirectory = "/Users/${host.username}";

  home.packages =
    (import ./pkgs.nix { inherit pkgs; })
    ++ ((lib.attrByPath [ "extras" "pkgs" ] (pkgs: [ ]) host) pkgs);

  fonts.fontconfig.enable = true;

  home = {
    sessionVariables = {
      EDITOR = "nvim";
    };

    file = {
      ".config/ghostty/config".source = ../files/ghostty/config;
      ".gitconfig".source = ../files/git/gitconfig;
      ".gitignore_global".source = ../files/git/gitignore_global;
      ".gitconfig.local".source = ../secrets/git/config.${host.hostName};
      ".config/nvim".source = ../files/nvim;

      # Secrets
      ".ssh/config".text = builtins.replaceStrings [ "@SSH_KEY@" ] [ host.sshKey ] (
        builtins.readFile ../secrets/ssh/config.template
      );
    };

    shellAliases = {
      # Rust re-maps
      l = "eza -a1lh";
      ls = "eza";
      cat = "bat";

      # QOL
      dc = "docker compose";
      rsync = "rsync -az --info=progress2";
      t = "tmux new-session -A -s main";
      e = "nvim";
      g = "lazygit";
      d = "lazydocker";
      p = "pnpm";
      px = "pnpm -s dlx";
      n = "fnm use --install-if-missing";
      c = "pwd | pbcopy";

      vai = "sudo darwin-rebuild switch --flake ~/.config/nix-macos#${host.hostName}";
    };
  };

  programs = {
    direnv.enable = true;
    zoxide.enable = true;

    fish = {
      enable = true;
      interactiveShellInit = ''
        if type -q starship
          starship init fish | source
        end
        if type -q fnm
          fnm env --use-on-cd | source
        end
      '';
    };
    bash = {
      enable = true;
    };
    tmux = {
      enable = true;
      clock24 = true;
      mouse = true;
      extraConfig = ''
        # switch panes using Alt-arrow without prefix
        bind -n M-Left select-pane -L
        bind -n M-Right select-pane -R
        bind -n M-Up select-pane -U
        bind -n M-Down select-pane -D

        # switch panes using jkhl
        bind h select-pane -L
        bind l select-pane -R
        bind j select-pane -U
        bind k select-pane -D
      '';
      shell = "${pkgs.fish}/bin/fish";
      terminal = "tmux-256color";
    };
  };
}
