Migrate global configuration to and expand home

- Move lots of system config to home (browser, editors, etc.)
- Improve catppuccin support (kitty, cursors, etc.)
- Improve overall theme (fonts, icons in kitty)
- Add coded's system hardware configuration ("shorthair")
- Add the ed editor
- Split minion's system hardware configuration ("greylag") into several files
- Improve shell support (aliases, useful packages, replacements, etc.)

Change-Id: Ie6d40f809b2662268a9a6fa8b241641bbfef9442
Reviewed-on: https://git.clicks.codes/c/Chimera/NixFiles/+/383
Tested-by: Skyler Grey <minion@clicks.codes>
Reviewed-by: Samuel Shuert <coded@clicks.codes>
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..0a6661c
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1 @@
+- [ ] Set default shell dynamically
\ No newline at end of file
diff --git a/flake.nix b/flake.nix
index 915c0e0..e493e54 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,5 +1,5 @@
 {
-  description = "All my Nix configurations";
+  description = "The Chimera nix configuration flake, a shared system configuration";
 
   inputs = {
     nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
@@ -52,7 +52,7 @@
 
       system.modules.nixos = [
         inputs.hyprland.nixosModules.default
-        inputs.nur.nixosModules.nur  
+        inputs.nur.nixosModules.nur
       ];
 
       snowfall = {
diff --git a/homes/x86_64-linux/coded@shorthair/default.nix b/homes/x86_64-linux/coded@shorthair/default.nix
index d710c95..cfe6138 100644
--- a/homes/x86_64-linux/coded@shorthair/default.nix
+++ b/homes/x86_64-linux/coded@shorthair/default.nix
@@ -20,6 +20,10 @@
 }:
 {
   chimera = {
+    shell = {
+      rebuildFlakePath = "/home/coded/Documents/programming/nix/Personal";
+    };
+
     hyprland = {
       enable = true;
 
@@ -41,9 +45,7 @@
     browser = {
       firefox = {
         enable = true;
-        extraExtensions = [
-          config.nur.repos.rycee.firefox-addons.simple-tab-groups
-        ];
+        extraExtensions = [ config.nur.repos.rycee.firefox-addons.simple-tab-groups ];
       };
 
       chromium = {
@@ -59,9 +61,9 @@
           ublockOrigin.enable = true;
         };
         extraExtensions = [
-          { id = "gmkiokemhjjdjmpnnjmnpkpfoenpnpne"; } #Lofi Girl
-          { id = "bmnlcjabgnpnenekpadlanbbkooimhnj"; } #PayPal Honey
-          { id = "kekjfbackdeiabghhcdklcdoekaanoel"; } #MAL Sync
+          { id = "gmkiokemhjjdjmpnnjmnpkpfoenpnpne"; } # Lofi Girl
+          { id = "bmnlcjabgnpnenekpadlanbbkooimhnj"; } # PayPal Honey
+          { id = "kekjfbackdeiabghhcdklcdoekaanoel"; } # MAL Sync
         ];
       };
     };
diff --git a/homes/x86_64-linux/minion@greylag/default.nix b/homes/x86_64-linux/minion@greylag/default.nix
index 2496649..c94cebc 100644
--- a/homes/x86_64-linux/minion@greylag/default.nix
+++ b/homes/x86_64-linux/minion@greylag/default.nix
@@ -63,9 +63,18 @@
         reactDevTools.enable = true;
         adnauseam.enable = true;
       };
-      extraExtensions = [
-        config.nur.repos.rycee.firefox-addons.sidebery
-      ];
+      extraExtensions = [ config.nur.repos.rycee.firefox-addons.sidebery ];
     };
+
+    shell.bash.enable = true;
+    shell.defaultAliases.enable = true;
+
+    theme.font.nerdFontGlyphs.enable = true;
+
+    editor.ed.enable = true;
+    editor.neovim.enable = true;
+    editor.emacs.enable = true;
+    editor.neovim.defaultEditor = false;
+    editor.emacs.defaultEditor = false;
   };
 }
diff --git a/modules/home/audio/default.nix b/modules/home/audio/default.nix
index 3d7903b..253ac3e 100644
--- a/modules/home/audio/default.nix
+++ b/modules/home/audio/default.nix
@@ -1,5 +1,4 @@
-{ pkgs, ... }: {
-  home.packages = [
-    pkgs.helvum
-  ];
-}
\ No newline at end of file
+{ pkgs, ... }:
+{
+  home.packages = [ pkgs.helvum ];
+}
diff --git a/modules/home/browser/chromium/default.nix b/modules/home/browser/chromium/default.nix
index 16dd34e..c21f21c 100644
--- a/modules/home/browser/chromium/default.nix
+++ b/modules/home/browser/chromium/default.nix
@@ -1,4 +1,5 @@
-{ lib, config, ... }: {
+{ lib, config, ... }:
+{
   options.chimera.browser.chromium = {
     enable = lib.mkEnableOption "Use chromium browser";
     extensions = {
@@ -12,22 +13,58 @@
       ublockOrigin.enable = lib.mkEnableOption "Turn on uBlock Origin ad blocker";
     };
     extraExtensions = lib.mkOption {
-      type = lib.types.listOf (lib.types.either { id = lib.types.str; } { id = lib.types.str; crxPath = lib.types.path; version = lib.types.str; });
+      type = lib.types.listOf (
+        lib.types.either { id = lib.types.str; } {
+          id = lib.types.str;
+          crxPath = lib.types.path;
+          version = lib.types.str;
+        }
+      );
       description = "Extra extensions to add to chromium on launch";
-      default = [];
+      default = [ ];
     };
   };
   config = lib.mkIf config.chimera.browser.chromium.enable ({
     programs.chromium = {
       enable = true;
       extensions =
-        (if config.chimera.browser.chromium.extensions.bitwarden.enable then [{ id = "nngceckbapebfimnlniiiahkandclblb"; }] else []) #Bitwarden
-        ++ (if config.chimera.browser.chromium.extensions.youtube.sponsorBlock.enable then [{ id = "mnjggcdmjocbbbhaepdhchncahnbgone"; }] else []) #Sponsor Block
-        ++ (if config.chimera.browser.chromium.extensions.youtube.returnDislike.enable then [{ id = "gebbhagfogifgggkldgodflihgfeippi"; }] else []) #Return youtube dislike
-        ++ (if config.chimera.browser.chromium.extensions.youtube.deArrow.enable then [{ id = "enamippconapkdmgfgjchkhakpfinmaj"; }] else []) #DeArrow
-        ++ (if config.chimera.browser.chromium.extensions.reactDevTools.enable then [{ id = "fmkadmapgofadopljbjfkapdkoienihi"; }] else []) #React Dev Tools
-        ++ (if config.chimera.browser.chromium.extensions.ublockOrigin.enable then [{ id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; }] else []) #uBlock Origin
+        (
+          if config.chimera.browser.chromium.extensions.bitwarden.enable then
+            [ { id = "nngceckbapebfimnlniiiahkandclblb"; } ]
+          else
+            [ ]
+        ) # Bitwarden
+        ++ (
+          if config.chimera.browser.chromium.extensions.youtube.sponsorBlock.enable then
+            [ { id = "mnjggcdmjocbbbhaepdhchncahnbgone"; } ]
+          else
+            [ ]
+        ) # Sponsor Block
+        ++ (
+          if config.chimera.browser.chromium.extensions.youtube.returnDislike.enable then
+            [ { id = "gebbhagfogifgggkldgodflihgfeippi"; } ]
+          else
+            [ ]
+        ) # Return youtube dislike
+        ++ (
+          if config.chimera.browser.chromium.extensions.youtube.deArrow.enable then
+            [ { id = "enamippconapkdmgfgjchkhakpfinmaj"; } ]
+          else
+            [ ]
+        ) # DeArrow
+        ++ (
+          if config.chimera.browser.chromium.extensions.reactDevTools.enable then
+            [ { id = "fmkadmapgofadopljbjfkapdkoienihi"; } ]
+          else
+            [ ]
+        ) # React Dev Tools
+        ++ (
+          if config.chimera.browser.chromium.extensions.ublockOrigin.enable then
+            [ { id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; } ]
+          else
+            [ ]
+        ) # uBlock Origin
         ++ config.chimera.browser.chromium.extraExtensions;
     };
   });
-}
\ No newline at end of file
+}
diff --git a/modules/home/browser/firefox/default.nix b/modules/home/browser/firefox/default.nix
index d1aa88f..3fcbf06 100644
--- a/modules/home/browser/firefox/default.nix
+++ b/modules/home/browser/firefox/default.nix
@@ -1,4 +1,5 @@
-{ lib, config, ... }: {
+{ lib, config, ... }:
+{
   options.chimera.browser.firefox = {
     enable = lib.mkEnableOption "Use firefox browser";
     extensions = {
@@ -20,14 +21,50 @@
   config = lib.mkIf config.chimera.browser.firefox.enable ({
     programs.firefox = {
       enable = true;
-      profiles.chimera.extensions = (if config.chimera.browser.firefox.extensions.bitwarden.enable then [ config.nur.repos.rycee.firefox-addons.bitwarden ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.youtube.sponsorBlock.enable then [ config.nur.repos.rycee.firefox-addons.sponsorblock ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.youtube.returnDislike.enable then [ config.nur.repos.rycee.firefox-addons.return-youtube-dislikes ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.youtube.deArrow.enable then [ config.nur.repos.rycee.firefox-addons.dearrow ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.reactDevTools.enable then [ config.nur.repos.rycee.firefox-addons.react-devtools ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.ublockOrigin.enable then [ config.nur.repos.rycee.firefox-addons.ublock-origin ] else [])
-        ++ (if config.chimera.browser.firefox.extensions.adnauseam.enable then [ config.nur.repos.rycee.firefox-addons.adnauseam ] else [])
+      profiles.chimera.extensions =
+        (
+          if config.chimera.browser.firefox.extensions.bitwarden.enable then
+            [ config.nur.repos.rycee.firefox-addons.bitwarden ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.youtube.sponsorBlock.enable then
+            [ config.nur.repos.rycee.firefox-addons.sponsorblock ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.youtube.returnDislike.enable then
+            [ config.nur.repos.rycee.firefox-addons.return-youtube-dislikes ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.youtube.deArrow.enable then
+            [ config.nur.repos.rycee.firefox-addons.dearrow ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.reactDevTools.enable then
+            [ config.nur.repos.rycee.firefox-addons.react-devtools ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.ublockOrigin.enable then
+            [ config.nur.repos.rycee.firefox-addons.ublock-origin ]
+          else
+            [ ]
+        )
+        ++ (
+          if config.chimera.browser.firefox.extensions.adnauseam.enable then
+            [ config.nur.repos.rycee.firefox-addons.adnauseam ]
+          else
+            [ ]
+        )
         ++ config.chimera.browser.firefox.extraExtensions;
     };
   });
-}
\ No newline at end of file
+}
diff --git a/modules/home/catppuccin/default.nix b/modules/home/catppuccin/default.nix
index 3389ba1..d705e57 100644
--- a/modules/home/catppuccin/default.nix
+++ b/modules/home/catppuccin/default.nix
@@ -1,4 +1,9 @@
-{ lib, config, ... }:
+{
+  pkgs,
+  lib,
+  config,
+  ...
+}:
 {
   options.chimera.theme.catppuccin = {
     enable = lib.mkEnableOption "Whether to use Catppuccin themes";
@@ -1410,9 +1415,18 @@
       };
     in
     {
-      chimera.theme.colors = catppuccinColors.${config.chimera.theme.catppuccin.style} // {
-        Highlight =
-          catppuccinColors.${config.chimera.theme.catppuccin.style}.${config.chimera.theme.catppuccin.color};
+      chimera.theme = {
+        colors = catppuccinColors.${config.chimera.theme.catppuccin.style} // {
+          Accent =
+            catppuccinColors.${config.chimera.theme.catppuccin.style}.${config.chimera.theme.catppuccin.color};
+        };
+
+        cursor = {
+          package =
+            pkgs.catppuccin-cursors."${lib.strings.toLower config.chimera.theme.catppuccin.style}${config.chimera.theme.catppuccin.color}";
+          name = "Catppuccin-${config.chimera.theme.catppuccin.style}-${config.chimera.theme.catppuccin.color}-Cursors";
+          size = 32;
+        };
       };
     }
   );
diff --git a/modules/home/editor/ed/default.nix b/modules/home/editor/ed/default.nix
new file mode 100644
index 0000000..80e4ac6
--- /dev/null
+++ b/modules/home/editor/ed/default.nix
@@ -0,0 +1,24 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+  options.chimera.editor.ed = {
+    enable = lib.mkEnableOption "Enable the standard text editor, the greatest WYGIWYG editor of all, the only viable text editor, Ed";
+    defaultEditor = lib.mkOption {
+      type = lib.types.bool;
+      description = "Use Ed as the default editor";
+      default = true;
+    };
+  };
+
+  config = lib.mkIf config.chimera.editor.ed.enable {
+    home.packages = [ pkgs.ed ];
+
+    home.sessionVariables = lib.mkIf config.chimera.editor.ed.defaultEditor {
+      EDITOR = "${pkgs.ed}/bin/ed";
+    };
+  };
+}
diff --git a/modules/home/editor/emacs/default.nix b/modules/home/editor/emacs/default.nix
new file mode 100644
index 0000000..4151db1
--- /dev/null
+++ b/modules/home/editor/emacs/default.nix
@@ -0,0 +1,19 @@
+{ config, lib, ... }:
+{
+  options.chimera.editor.emacs = {
+    enable = lib.mkEnableOption "Enable emacs editor";
+    defaultEditor = lib.mkOption {
+      type = lib.types.bool;
+      description = "Use emacs as the default editor";
+      default = true;
+    };
+  };
+
+  config = lib.mkIf config.chimera.editor.emacs.enable {
+    programs.emacs.enable = true;
+    services.emacs = {
+      enable = true;
+      defaultEditor = config.chimera.editor.emacs.defaultEditor;
+    };
+  };
+}
diff --git a/modules/home/editor/neovim/default.nix b/modules/home/editor/neovim/default.nix
new file mode 100644
index 0000000..7098365
--- /dev/null
+++ b/modules/home/editor/neovim/default.nix
@@ -0,0 +1,18 @@
+{ config, lib, ... }:
+{
+  options.chimera.editor.neovim = {
+    enable = lib.mkEnableOption "Enable neovim editor";
+    defaultEditor = lib.mkOption {
+      type = lib.types.bool;
+      description = "Use neovim as the default editor";
+      default = true;
+    };
+  };
+
+  config = lib.mkIf config.chimera.editor.neovim.enable {
+    programs.neovim = {
+      enable = true;
+      defaultEditor = config.chimera.editor.neovim.defaultEditor;
+    };
+  };
+}
diff --git a/modules/home/git/default.nix b/modules/home/git/default.nix
new file mode 100644
index 0000000..6a161ea
--- /dev/null
+++ b/modules/home/git/default.nix
@@ -0,0 +1,175 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+  options.chimera.git = {
+    gitReview.enable = lib.mkEnableOption "Enable git review";
+    delta.enable = lib.mkEnableOption "Enable delta, an alternative pager for git diffs that highlights syntax";
+    auth = {
+      clicksUsername = lib.mkOption {
+        type = lib.types.str;
+        description = "Username for Clicks Gerrit";
+      };
+    };
+  };
+
+  config = {
+
+    home.packages = (if config.chimera.git.gitReview.enable then [ pkgs.git-review ] else [ ]);
+
+    programs.zsh.shellAliases =
+      if config.chimera.git.gitReview.enable then { "gr!" = "git review"; } else { };
+
+    programs.bash.shellAliases =
+      if config.chimera.git.gitReview.enable then { "gr!" = "git review"; } else { };
+
+    programs.git = {
+      enable = true;
+
+      delta.enable = config.chimera.git.delta.enable;
+
+      extraConfig = {
+        init.defaultBranch = "main";
+        advice.skippedcherrypicks = false;
+        commit.gpgsign = true;
+        credential.helper = "cache";
+        core = {
+          repositoryformatversion = 0;
+          filemode = true;
+          bare = false;
+          logallrefupdates = true;
+          fsmonitor = true;
+          autocrlf = "input";
+          splitIndex = true;
+          untrackedCache = true;
+        };
+        pull = {
+          rebase = "merges"; # TODO: from git docs, should we provide an option for this?: NOTE: this is a possibly dangerous operation; do not use it unless you understand the implications (see git-rebase[1] for details).
+        };
+        push = {
+          autoSetupRemote = true;
+          gpgSign = "if-asked";
+        };
+        url = {
+          "ssh://git@github.com/".pushInsteadOf = "https://github.com/";
+          "ssh://minion@ssh.clicks.codes:29418/".pushInsteadOf = "https://git.clicks.codes/";
+        };
+        merge.conflictstyle = "diff3";
+        trailer.ifexists = "addIfDifferent";
+      };
+    };
+  };
+}
+
+/* [alias]
+   	recommit = "!git commit --verbose -eF $(git rev-parse --git-dir)/COMMIT_EDITMSG"
+   	stash-working = "!f() { \
+   		git commit --quiet --no-verify -m \"temp for stash-working\" && \
+           	git stash push \"$@\" && \
+           	git reset --quiet --soft HEAD~1; \
+   	}; f"
+   	checkout-soft = "!f() { \
+   	   hash=$(git hash); \
+   	   git checkout \"$@\"; \
+   	   git reset --soft $hash; \
+   	}; f" # basically the opposite of a soft reset: change all the files but do not change the HEAD reference
+   	graph = "log --graph --oneline --decorate"
+   	fmt = "clang-format"
+   	hash = "rev-parse HEAD"
+   	fmt-last = "!f() { \
+   		hash=$(git hash); \
+   		git reset --soft HEAD^ && \
+   		git fmt; \
+   		git reset --soft $hash; \
+   	}; f"
+   	personal = "config user.email skyler3665@gmail.com"
+   	clicks = "config user.email minion@clicks.codes"
+   	collabora = "config user.email skyler.grey@collabora.com"
+   	# review = "!git-review -T": cannot be set here, set in .zshrc instead
+
+   [credential]
+   	helper = "store"
+
+   /*
+   [user]
+   	name = "Skyler Grey"
+   	signingkey = "7C868112B5390C5C"
+     useConfigOnly = true # avoid auto-setting user.email by hostname
+
+   [alias]
+   	recommit = "!git commit --verbose -eF $(git rev-parse --git-dir)/COMMIT_EDITMSG"
+   	stash-working = "!f() { \
+   		git commit --quiet --no-verify -m \"temp for stash-working\" && \
+           	git stash push \"$@\" && \
+           	git reset --quiet --soft HEAD~1; \
+   	}; f"
+   	checkout-soft = "!f() { \
+   	   hash=$(git hash); \
+   	   git checkout \"$@\"; \
+   	   git reset --soft $hash; \
+   	}; f" # basically the opposite of a soft reset: change all the files but do not change the HEAD reference
+   	graph = "log --graph --oneline --decorate"
+   	fmt = "clang-format"
+   	hash = "rev-parse HEAD"
+   	fmt-last = "!f() { \
+   		hash=$(git hash); \
+   		git reset --soft HEAD^ && \
+   		git fmt; \
+   		git reset --soft $hash; \
+   	}; f"
+   	personal = "config user.email skyler3665@gmail.com"
+   	clicks = "config user.email minion@clicks.codes"
+   	collabora = "config user.email skyler.grey@collabora.com"
+   	# review = "!git-review -T": cannot be set here, set in .zshrc instead
+
+   [init]
+   	defaultBranch = "main"
+
+   [color]
+   	ui = "auto"
+
+   [core]
+   	autocrlf = "input"
+   	splitIndex = true
+   	untrackedCache = true
+   	fsmonitor = true
+   	pager = "delta"
+
+   [pull]
+   	rebase = merges
+
+   [push]
+   	autoSetupRemote = true
+   	useForceIfIncludes = true
+   	gpgSign = if-asked
+
+   [credential]
+   	helper = "store"
+
+   [commit]
+   	gpgsign = true
+
+   [url "ssh://git@github.com/"]
+   	pushInsteadOf = "https://github.com/"
+
+   [interactive]
+   	diffFilter = "delta --color-only"
+
+   [delta]
+   	navigate = true
+   	light = false
+   	line-numbers = true
+   	features = "my-dark-theme zebra-dark"
+
+   [merge]
+   	conflictstyle = "diff3"
+
+   [diff]
+   	colorMoved = "default"
+
+   [trailer]
+   	ifexists = "addIfDifferent"
+*/
diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix
index ce1a300..38d40cd 100644
--- a/modules/home/hyprland/default.nix
+++ b/modules/home/hyprland/default.nix
@@ -89,7 +89,7 @@
             disable_splash_rendering = true;
           };
 
-          exec-once = "${pkgs.hyprpaper}/bin/hyprpaper";
+          exec-once = "${pkgs.hyprpaper}/bin/hyprpaper; hyprctl setcursor ${config.chimera.theme.cursor.name} ${builtins.toString config.chimera.theme.cursor.size}";
 
           monitor = config.chimera.hyprland.monitors ++ [ ",preferred,auto,1" ];
 
diff --git a/modules/home/shell/bash/default.nix b/modules/home/shell/bash/default.nix
new file mode 100644
index 0000000..3eb3bf6
--- /dev/null
+++ b/modules/home/shell/bash/default.nix
@@ -0,0 +1,24 @@
+{ config, lib, ... }:
+{
+  options.chimera.shell.bash = {
+    enable = lib.mkEnableOption "Enable Bash Shell";
+    default = lib.mkOption {
+      type = lib.types.bool;
+      description = "Set as default shell";
+      default = true;
+    };
+    extraAliases = lib.mkOption {
+      type = lib.types.attrsOf lib.types.str;
+      description = "Attrset of extra shell aliases";
+      default = { };
+    };
+  };
+
+  config = lib.mkIf config.chimera.shell.bash.enable {
+    programs.bash = {
+      enable = true;
+
+      shellAliases = config.chimera.shell.bash.extraAliases;
+    };
+  };
+}
diff --git a/modules/home/shell/default.nix b/modules/home/shell/default.nix
new file mode 100644
index 0000000..f03ad77
--- /dev/null
+++ b/modules/home/shell/default.nix
@@ -0,0 +1,67 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+  options.chimera.shell = {
+    rebuildFlakePath = lib.mkOption {
+      type = lib.types.nullOr lib.types.str;
+      description = "Full path to where you store your flake locally";
+      default = null;
+    };
+    defaultAliases.enable = lib.mkEnableOption "Use sensible custom aliases";
+    usefulPackages.enable = lib.mkEnableOption "Enable useful shell packages (ripgrep, wget, etc)";
+    replacements = {
+      eza.enable = lib.mkEnableOption "Use eza instead of ls";
+      bfs.enable = lib.mkEnableOption "Use bfs instead of find";
+      ripgrep.enable = lib.mkEnableOption "Use ripgrep instead of grep";
+      htop.enable = lib.mkEnableOption "Use htop instead of top";
+      erdtree.enable = lib.mkEnableOption "Use erdtree instead of tree";
+      dust.enable = lib.mkEnableOption "Use dust instead of du";
+      bat.enable = lib.mkEnableOption "Use bat instead of cat";
+    };
+  };
+
+  config = {
+    home.shellAliases = lib.mkIf config.chimera.shell.defaultAliases.enable {
+      rebuild =
+        lib.mkIf (config.chimera.shell.rebuildFlakePath != null)
+          "sudo nixos-rebuild switch --flake ${config.chimera.shell.rebuildFlakePath}";
+      clr = "clear";
+      edit = config.home.sessionVariables.EDITOR;
+    };
+
+    programs = lib.mkIf config.chimera.shell.usefulPackages.enable {
+      tealdeer = {
+        enable = true;
+        settings.updates.autoupdate = true;
+      };
+      jq.enable = true;
+    };
+
+    home.packages =
+      (
+        if config.chimera.shell.usefulPackages.enable then
+          [
+            pkgs.wget
+            pkgs.curl
+            pkgs.curlie
+            pkgs.pv
+            pkgs.sd
+            pkgs.tokei
+            pkgs.hyperfine
+          ]
+        else
+          [ ]
+      )
+      ++ (if config.chimera.shell.replacements.eza.enable then [ pkgs.eza ] else [ ])
+      ++ (if config.chimera.shell.replacements.bfs.enable then [ pkgs.bfs ] else [ ])
+      ++ (if config.chimera.shell.replacements.ripgrep.enable then [ pkgs.ripgrep ] else [ ])
+      ++ (if config.chimera.shell.replacements.htop.enable then [ pkgs.htop ] else [ ])
+      ++ (if config.chimera.shell.replacements.erdtree.enable then [ pkgs.erdtree ] else [ ])
+      ++ (if config.chimera.shell.replacements.dust.enable then [ pkgs.dust ] else [ ])
+      ++ (if config.chimera.shell.replacements.bat.enable then [ pkgs.bat ] else [ ]);
+  };
+}
diff --git a/modules/home/shell/starship/default.nix b/modules/home/shell/starship/default.nix
new file mode 100644
index 0000000..4a958eb
--- /dev/null
+++ b/modules/home/shell/starship/default.nix
@@ -0,0 +1,13 @@
+{ config, lib, ... }:
+{
+  options.chimera.shell.starship.enable = lib.mkEnableOption "Enable to use starship prompt";
+
+  config = lib.mkIf config.chimera.shell.starship.enable {
+    programs.starship = {
+      enable = true;
+      settings = {
+        format = "$all";
+      };
+    };
+  };
+}
diff --git a/modules/home/shell/zsh/default.nix b/modules/home/shell/zsh/default.nix
new file mode 100644
index 0000000..6b669fd
--- /dev/null
+++ b/modules/home/shell/zsh/default.nix
@@ -0,0 +1,51 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+
+  options.chimera.shell.zsh = {
+    enable = lib.mkEnableOption "Enable ZSH Shell";
+    default = lib.mkOption {
+      type = lib.types.bool;
+      description = "Set as default shell";
+      default = true;
+    };
+    extraAliases = lib.mkOption {
+      type = lib.attrsOf lib.types.str;
+      description = "Attrset of extra shell aliases";
+      default = { };
+    };
+    dirHashes = lib.mkOption {
+      type = lib.attrsOf lib.types.str;
+      description = "Attrset of ~DIR's";
+      default = { };
+    };
+  };
+
+  config = lib.mkIf config.chimera.shell.zsh.enable {
+    programs.zsh = {
+      enable = true;
+      enableAutosuggestions = true;
+      enableCompletion = true;
+      autocd = true;
+      defaultKeymap = "emacs";
+
+      shellAliases = config.chimera.shell.zsh.extraAliases;
+
+      dirHashes = config.chimera.shell.zsh.dirHashes;
+
+      history = {
+        extended = true;
+      };
+      historySubstringSearch.enable = true;
+
+      oh-my-zsh = {
+        enable = true;
+        plugins = [ "git" ];
+      };
+    };
+  };
+}
diff --git a/modules/home/terminal/default.nix b/modules/home/terminal/default.nix
new file mode 100644
index 0000000..2465620
--- /dev/null
+++ b/modules/home/terminal/default.nix
@@ -0,0 +1,35 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
+  options.chimera.terminal.kitty = {
+    enable = lib.mkOption {
+      type = lib.types.bool;
+      description = "Use kitty as your terminal";
+      default = true;
+    };
+  };
+
+  config = lib.mkIf config.chimera.terminal.kitty.enable {
+    programs.kitty = {
+      enable = true;
+      theme =
+        if config.chimera.theme.catppuccin.enable then
+          "Catppuccin-${config.chimera.theme.catppuccin.style}"
+        else
+          null;
+      font = config.chimera.theme.font.mono;
+      shellIntegration = {
+        enableZshIntegration = config.chimera.shell.zsh.enable;
+        enableBashIntegration = config.chimera.shell.bash.enable;
+      };
+      settings = {
+        confirm_os_window_close = -1;
+        symbol_map = lib.mkIf config.chimera.theme.font.nerdFontGlyphs.enable "U+23FB-U+23FE,U+2665,U+26A1,U+2B58,U+E000-U+E00A,U+E0A0-U+E0A3,U+E0B0-U+E0D4,U+E200-U+E2A9,U+E300-U+E3E3,U+E5FA-U+E6AA,U+E700-U+E7C5,U+EA60-U+EBEB,U+F000-U+F2E0,U+F300-U+F32F,U+F400-U+F4A9,U+F500-U+F8FF,U+F0001-U+F1AF0 Symbols Nerd Font Mono";
+      };
+    };
+  };
+}
diff --git a/modules/home/theme/default.nix b/modules/home/theme/default.nix
index 5fdb405..11478c8 100644
--- a/modules/home/theme/default.nix
+++ b/modules/home/theme/default.nix
@@ -2,11 +2,87 @@
   pkgs,
   config,
   lib,
+  inputs,
   ...
 }:
 {
   options.chimera.theme = {
-    cursor = null;
+    font = {
+      mono = lib.mkOption {
+        type = inputs.home-manager.lib.hm.types.fontType;
+        description = "Mono width font to use as system default";
+        default = {
+          name = "FiraCode";
+          package = pkgs.fira-code;
+          size = 12;
+        };
+      };
+      variableWidth = {
+        serif = lib.mkOption {
+          type = inputs.home-manager.lib.hm.types.fontType;
+          description = "Serif variable width font to use as system default";
+          default = {
+            name = "Roboto Serif";
+            package = pkgs.roboto-serif;
+            size = 12;
+          };
+        };
+        sansSerif = lib.mkOption {
+          type = inputs.home-manager.lib.hm.types.fontType;
+          description = "Sans serif variable width font to use as system default";
+          default = {
+            name = "Roboto";
+            package = pkgs.roboto;
+            size = 12;
+          };
+        };
+      };
+      emoji = lib.mkOption {
+        type = inputs.home-manager.lib.hm.types.fontType;
+        description = "Emoji's to use as system default";
+        default = {
+          name = "Twitter Color Emoji";
+          package = pkgs.twitter-color-emoji;
+          size = 12;
+        };
+      };
+      nerdFontGlyphs.enable = lib.mkEnableOption "Enable Nerd Font Glyphs";
+      extraFonts = lib.mkOption {
+        type = lib.types.listOf inputs.home-manager.lib.hm.types.fontType;
+        description = "Extra fonts to install";
+        default = [ ];
+      };
+    };
+
+    cursor = lib.mkOption {
+      type = lib.types.nullOr (
+        lib.types.submodule {
+          options = {
+            package = lib.mkOption {
+              type = lib.types.package;
+              example = lib.literalExpression "pkgs.vanilla-dmz";
+              description = "Package providing the cursor theme";
+            };
+
+            name = lib.mkOption {
+              type = lib.types.str;
+              example = "Vanilla-DMZ";
+              description = "The cursor name within the package";
+            };
+
+            size = lib.mkOption {
+              type = lib.types.int;
+              default = 32;
+              example = 64;
+              description = "The cursor size";
+            };
+          };
+        }
+      );
+      description = "Cursor settings";
+      default = null;
+    };
+
     colors =
       let
         themeColor = {
@@ -50,7 +126,35 @@
         Base = lib.mkOption { type = themeColor; };
         Mantle = lib.mkOption { type = themeColor; };
         Crust = lib.mkOption { type = themeColor; };
-        Highlight = lib.mkOption { type = themeColor; };
+        Accent = lib.mkOption { type = themeColor; };
       };
   };
+
+  config = {
+
+    fonts.fontconfig.enable = true;
+
+    home.packages =
+      [
+        config.chimera.theme.font.mono.package
+        config.chimera.theme.font.variableWidth.serif.package
+        config.chimera.theme.font.variableWidth.sansSerif.package
+        config.chimera.theme.font.emoji.package
+      ]
+      ++ (
+        if config.chimera.theme.font.nerdFontGlyphs.enable then
+          [ (pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; }) ]
+        else
+          [ ]
+      )
+      ++ config.chimera.theme.font.extraFonts;
+
+    home.pointerCursor = lib.mkIf (config.chimera.theme.cursor != null) {
+      name = config.chimera.theme.cursor.name;
+      package = config.chimera.theme.cursor.package;
+      size = config.chimera.theme.cursor.size;
+      gtk.enable = true; # TODO: should we factor this out into a gtk module when we come to that?
+      x11.enable = true;
+    };
+  };
 }
diff --git a/modules/nixos/bluetooth/default.nix b/modules/nixos/bluetooth/default.nix
index d2a2666..19b603d 100644
--- a/modules/nixos/bluetooth/default.nix
+++ b/modules/nixos/bluetooth/default.nix
@@ -1,4 +1,5 @@
-{ ... }: {
+{ ... }:
+{
   hardware.bluetooth.enable = true;
   hardware.bluetooth.powerOnBoot = true;
-}
\ No newline at end of file
+}
diff --git a/modules/nixos/browsers/default.nix b/modules/nixos/browsers/default.nix
deleted file mode 100644
index 1d72a8d..0000000
--- a/modules/nixos/browsers/default.nix
+++ /dev/null
@@ -1,4 +0,0 @@
-{ pkgs, ... }:
-{
-  environment.systemPackages = [ pkgs.firefox ];
-}
diff --git a/modules/nixos/editors/default.nix b/modules/nixos/editors/default.nix
index 4c12f30..cd527e8 100644
--- a/modules/nixos/editors/default.nix
+++ b/modules/nixos/editors/default.nix
@@ -1,8 +1,4 @@
 { pkgs, ... }:
 {
-  environment.systemPackages = [
-    pkgs.emacs
-    pkgs.neovim
-    pkgs.vscode-fhs
-  ];
+  environment.systemPackages = [ pkgs.vscode-fhs ];
 }
diff --git a/modules/nixos/git/default.nix b/modules/nixos/git/default.nix
deleted file mode 100644
index 8a64e0d..0000000
--- a/modules/nixos/git/default.nix
+++ /dev/null
@@ -1,4 +0,0 @@
-{ pkgs, ... }:
-{
-  environment.systemPackages = [ pkgs.git ];
-}
diff --git a/modules/nixos/hyprland/default.nix b/modules/nixos/hyprland/default.nix
deleted file mode 100644
index 40f30df..0000000
--- a/modules/nixos/hyprland/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{ ... }:
-{
-  programs.hyprland.enable = true;
-
-  users.users.minion.extraGroups = [ "input" ];
-}
diff --git a/modules/nixos/nix/default.nix b/modules/nixos/nix/default.nix
index dff4f4f..252382b 100644
--- a/modules/nixos/nix/default.nix
+++ b/modules/nixos/nix/default.nix
@@ -1,7 +1,6 @@
-{ ... }:
+{ system, ... }:
 {
   system.stateVersion = "24.05";
-  console.keyMap = "dvorak";
 
   nix.settings = {
     builders-use-substitutes = true;
@@ -21,4 +20,6 @@
       "flakes"
     ];
   };
+
+  nixpkgs.hostPlatform = system;
 }
diff --git a/modules/nixos/terminals/default.nix b/modules/nixos/terminals/default.nix
deleted file mode 100644
index b28aa04..0000000
--- a/modules/nixos/terminals/default.nix
+++ /dev/null
@@ -1,4 +0,0 @@
-{ pkgs, ... }:
-{
-  environment.systemPackages = [ pkgs.kitty ];
-}
diff --git a/modules/nixos/users/default.nix b/modules/nixos/users/default.nix
index 58c28df..997288c 100644
--- a/modules/nixos/users/default.nix
+++ b/modules/nixos/users/default.nix
@@ -2,10 +2,9 @@
 {
   users.users.minion = {
     isNormalUser = true;
-    extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
-    packages = [
-      pkgs.firefox
-      pkgs.tree
+    extraGroups = [
+      "wheel"
+      "input"
     ];
     initialPassword = "nixos";
   };
diff --git a/systems/x86_64-linux/greylag/boot/filesystems/default.nix b/systems/x86_64-linux/greylag/boot/filesystems/default.nix
new file mode 100644
index 0000000..4890eb5
--- /dev/null
+++ b/systems/x86_64-linux/greylag/boot/filesystems/default.nix
@@ -0,0 +1,71 @@
+{ lib, ... }:
+{
+  fileSystems =
+    (lib.mapAttrs
+      (_: share_name: {
+        device = "/dev/disk/by-label/BTRFS0";
+        fsType = "btrfs";
+        options = [
+          "subvol=shared/${share_name}"
+          "compress=zstd:1"
+        ];
+      })
+      {
+        "/home/minion/Code" = "@Code";
+        "/var/lib/containers" = "@containers";
+        "/etc/NetworkManager" = "@NetworkManager";
+        "/home/minion/.local/share/containers/storage" = "@personal-containers";
+        "/home/minion/.gtimelog" = "@gtimelog";
+        "/home/minion/Documents" = "@documents";
+      }
+    )
+    // {
+      "/mnt" = {
+        device = "/dev/mapper/key";
+        fsType = "ext4";
+      };
+
+      "/" = {
+        device = "/dev/disk/by-label/BTRFS0";
+        fsType = "btrfs";
+        options = [
+          "subvol=@nixos"
+          "compress=zstd:1"
+        ];
+      };
+
+      "/var" = {
+        device = "/dev/disk/by-label/BTRFS0";
+        fsType = "btrfs";
+        options = [
+          "subvol=@nixos-var"
+          "compress=zstd:1"
+        ];
+      };
+
+      "/home" = {
+        device = "/dev/disk/by-label/BTRFS0";
+        fsType = "btrfs";
+        options = [
+          "subvol=@nixos-home"
+          "compress=zstd:1"
+        ];
+      };
+
+      "/nix" = {
+        device = "/dev/disk/by-label/BTRFS0";
+        fsType = "btrfs";
+        options = [
+          "subvol=@nixos-nix"
+          "compress=zstd:1"
+        ];
+      };
+
+      "/boot" = {
+        device = "/dev/disk/by-label/ESP";
+        fsType = "vfat";
+      };
+    };
+
+  swapDevices = [ ];
+}
diff --git a/systems/x86_64-linux/greylag/boot/initrd/default.nix b/systems/x86_64-linux/greylag/boot/initrd/default.nix
new file mode 100644
index 0000000..0ef8a71
--- /dev/null
+++ b/systems/x86_64-linux/greylag/boot/initrd/default.nix
@@ -0,0 +1,30 @@
+{ ... }:
+{
+  boot.loader.systemd-boot.enable = true;
+  boot.loader.efi.canTouchEfiVariables = true;
+
+  boot.initrd.availableKernelModules = [
+    "xhci_pci"
+    "thunderbolt"
+    "nvme"
+    "uas"
+    "usbhid"
+    "sd_mod"
+    "ext4"
+  ];
+  boot.initrd.kernelModules = [ ];
+  boot.kernelModules = [ "kvm-intel" ];
+  boot.extraModulePackages = [ ];
+
+  boot.initrd.systemd.enable = true; # needed for the way we do our YubiKey
+  boot.initrd.luks.devices."key".device = "/dev/disk/by-label/KEY";
+
+  boot.initrd.luks.devices."luks-expansion0" = {
+    device = "/dev/disk/by-label/EXPANSION0";
+    keyFile = "/key:/dev/mapper/key";
+  };
+  boot.initrd.luks.devices."luks-ssd0" = {
+    device = "/dev/disk/by-label/SSD0";
+    keyFile = "/key:/dev/mapper/key";
+  };
+}
diff --git a/systems/x86_64-linux/greylag/console/default.nix b/systems/x86_64-linux/greylag/console/default.nix
new file mode 100644
index 0000000..f629085
--- /dev/null
+++ b/systems/x86_64-linux/greylag/console/default.nix
@@ -0,0 +1,5 @@
+{ ... }:
+{
+  console.keyMap = "dvorak";
+  environment.pathsToLink = [ "/share/zsh" ];
+}
diff --git a/systems/x86_64-linux/greylag/cpu/default.nix b/systems/x86_64-linux/greylag/cpu/default.nix
new file mode 100644
index 0000000..589baa0
--- /dev/null
+++ b/systems/x86_64-linux/greylag/cpu/default.nix
@@ -0,0 +1,5 @@
+{ config, ... }:
+{
+  powerManagement.cpuFreqGovernor = "powersave";
+  hardware.cpu.intel.updateMicrocode = config.hardware.enableRedistributableFirmware;
+}
diff --git a/systems/x86_64-linux/greylag/default.nix b/systems/x86_64-linux/greylag/default.nix
index 1d2532e..79563b3 100644
--- a/systems/x86_64-linux/greylag/default.nix
+++ b/systems/x86_64-linux/greylag/default.nix
@@ -1,123 +1,10 @@
+{ ... }:
 {
-  lib,
-  pkgs,
-  inputs,
-  system,
-  target,
-  format,
-  virtual,
-  systems,
-  config,
-  ...
-}:
-{
-  networking.hostName = "greylag";
-  boot.loader.systemd-boot.enable = true;
-  boot.loader.efi.canTouchEfiVariables = true;
-
-  boot.initrd.availableKernelModules = [
-    "xhci_pci"
-    "thunderbolt"
-    "nvme"
-    "uas"
-    "usbhid"
-    "sd_mod"
-    "ext4"
+  imports = [
+    ./boot/filesystems
+    ./boot/initrd
+    ./console
+    ./cpu
+    ./networking
   ];
-  boot.initrd.kernelModules = [ ];
-  boot.kernelModules = [ "kvm-intel" ];
-  boot.extraModulePackages = [ ];
-
-  boot.initrd.systemd.enable = true; # needed for the way we do our YubiKey
-  boot.initrd.luks.devices."key".device = "/dev/disk/by-label/KEY";
-
-  boot.initrd.luks.devices."luks-expansion0" = {
-    device = "/dev/disk/by-label/EXPANSION0";
-    keyFile = "/key:/dev/mapper/key";
-  };
-  boot.initrd.luks.devices."luks-ssd0" = {
-    device = "/dev/disk/by-label/SSD0";
-    keyFile = "/key:/dev/mapper/key";
-  };
-
-  fileSystems =
-    (lib.mapAttrs
-      (_: share_name: {
-        device = "/dev/disk/by-label/BTRFS0";
-        fsType = "btrfs";
-        options = [
-          "subvol=shared/${share_name}"
-          "compress=zstd:1"
-        ];
-      })
-      {
-        "/home/minion/Code" = "@Code";
-        "/var/lib/containers" = "@containers";
-        "/etc/NetworkManager" = "@NetworkManager";
-        "/home/minion/.local/share/containers/storage" = "@personal-containers";
-        "/home/minion/.gtimelog" = "@gtimelog";
-        "/home/minion/Documents" = "@documents";
-      }
-    )
-    // {
-      "/mnt" = {
-        device = "/dev/mapper/key";
-        fsType = "ext4";
-      };
-
-      "/" = {
-        device = "/dev/disk/by-label/BTRFS0";
-        fsType = "btrfs";
-        options = [
-          "subvol=@nixos"
-          "compress=zstd:1"
-        ];
-      };
-
-      "/var" = {
-        device = "/dev/disk/by-label/BTRFS0";
-        fsType = "btrfs";
-        options = [
-          "subvol=@nixos-var"
-          "compress=zstd:1"
-        ];
-      };
-
-      "/home" = {
-        device = "/dev/disk/by-label/BTRFS0";
-        fsType = "btrfs";
-        options = [
-          "subvol=@nixos-home"
-          "compress=zstd:1"
-        ];
-      };
-
-      "/nix" = {
-        device = "/dev/disk/by-label/BTRFS0";
-        fsType = "btrfs";
-        options = [
-          "subvol=@nixos-nix"
-          "compress=zstd:1"
-        ];
-      };
-
-      "/boot" = {
-        device = "/dev/disk/by-label/ESP";
-        fsType = "vfat";
-      };
-    };
-
-  swapDevices = [ ];
-
-  # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
-  # (the default) this is the recommended approach. When using systemd-networkd it's
-  # still possible to use this option, but it's recommended to use it in conjunction
-  # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
-  networking.useDHCP = lib.mkDefault true;
-  # networking.interfaces.enp0s13f0u4u4u4.useDHCP = lib.mkDefault true;
-  # networking.interfaces.wlp166s0.useDHCP = lib.mkDefault true;
-
-  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
-  powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
-  hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
 }
diff --git a/systems/x86_64-linux/greylag/networking/default.nix b/systems/x86_64-linux/greylag/networking/default.nix
new file mode 100644
index 0000000..e757b94
--- /dev/null
+++ b/systems/x86_64-linux/greylag/networking/default.nix
@@ -0,0 +1,4 @@
+{
+  networking.hostName = "greylag";
+  networking.useDHCP = true;
+}
diff --git a/systems/x86_64-linux/shorthair/console/default.nix b/systems/x86_64-linux/shorthair/console/default.nix
new file mode 100644
index 0000000..d54e9fb
--- /dev/null
+++ b/systems/x86_64-linux/shorthair/console/default.nix
@@ -0,0 +1,4 @@
+{ ... }:
+{
+  console.keymap = "us";
+}
diff --git a/systems/x86_64-linux/shorthair/default.nix b/systems/x86_64-linux/shorthair/default.nix
index 61b0ecb..3b77fc8 100644
--- a/systems/x86_64-linux/shorthair/default.nix
+++ b/systems/x86_64-linux/shorthair/default.nix
@@ -1,48 +1,10 @@
+{ ... }:
 {
-  config,
-  lib,
-  pkgs,
-  modulesPath,
-  ...
-}:
-
-{
-  imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
-
-  boot.initrd.availableKernelModules = [
-    "nvme"
-    "xhci_pci"
-    "ahci"
-    "usb_storage"
-    "usbhid"
-    "sd_mod"
-    "sr_mod"
+  imports = [
+    ./hardware/boot
+    ./hardware/filesystems
+    ./hardware/cpu
+    ./console
+    ./networking
   ];
-  boot.initrd.kernelModules = [ "amdgpu" ];
-  boot.kernelModules = [ ];
-  boot.extraModulePackages = [ ];
-
-  boot.initrd = {
-    luks.devices."luks-bf23eee1-7cb7-43b9-822f-a9f49ea0a768".device =
-      "/dev/disk/by-uuid/bf23eee1-7cb7-43b9-822f-a9f49ea0a768";
-    luks.devices."luks-c38bc921-8979-4a25-9520-f3354dee3557".device =
-      "/dev/disk/by-uuid/c38bc921-8979-4a25-9520-f3354dee3557";
-  };
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/63caf2b5-90d4-49a7-99e9-98dcdd797859";
-    fsType = "ext4";
-  };
-
-  fileSystems."/boot" = {
-    device = "/dev/disk/by-uuid/5B78-4B2D";
-    fsType = "vfat";
-  };
-
-  swapDevices = [ { device = "/dev/disk/by-uuid/3a9212d4-6c39-4d5b-abf0-49294bd991c9"; } ];
-
-  networking.useDHCP = lib.mkDefault true;
-
-  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
-  hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
 }
diff --git a/systems/x86_64-linux/shorthair/hardware/boot/default.nix b/systems/x86_64-linux/shorthair/hardware/boot/default.nix
new file mode 100644
index 0000000..6301e3b
--- /dev/null
+++ b/systems/x86_64-linux/shorthair/hardware/boot/default.nix
@@ -0,0 +1,20 @@
+{ ... }:
+{
+  boot.initrd.availableKernelModules = [
+    "nvme"
+    "xhci_pci"
+    "ahci"
+    "usb_storage"
+    "usbhid"
+    "sd_mod"
+    "sr_mod"
+  ];
+  boot.initrd.kernelModules = [ "amdgpu" ];
+  boot.kernelModules = [ ];
+  boot.extraModulePackages = [ ];
+
+  boot.initrd = {
+    luks.devices."luks-bf23eee1-7cb7-43b9-822f-a9f49ea0a768".device = "/dev/disk/by-uuid/bf23eee1-7cb7-43b9-822f-a9f49ea0a768";
+    luks.devices."luks-c38bc921-8979-4a25-9520-f3354dee3557".device = "/dev/disk/by-uuid/c38bc921-8979-4a25-9520-f3354dee3557";
+  };
+}
diff --git a/systems/x86_64-linux/shorthair/hardware/cpu/default.nix b/systems/x86_64-linux/shorthair/hardware/cpu/default.nix
new file mode 100644
index 0000000..c019598
--- /dev/null
+++ b/systems/x86_64-linux/shorthair/hardware/cpu/default.nix
@@ -0,0 +1,4 @@
+{ lib, config, ... }:
+{
+  hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/systems/x86_64-linux/shorthair/hardware/filesystems/default.nix b/systems/x86_64-linux/shorthair/hardware/filesystems/default.nix
new file mode 100644
index 0000000..f9ce7e8
--- /dev/null
+++ b/systems/x86_64-linux/shorthair/hardware/filesystems/default.nix
@@ -0,0 +1,14 @@
+{ ... }:
+{
+  fileSystems."/" = {
+    device = "/dev/disk/by-uuid/63caf2b5-90d4-49a7-99e9-98dcdd797859";
+    fsType = "ext4";
+  };
+
+  fileSystems."/boot" = {
+    device = "/dev/disk/by-uuid/5B78-4B2D";
+    fsType = "vfat";
+  };
+
+  swapDevices = [ { device = "/dev/disk/by-uuid/3a9212d4-6c39-4d5b-abf0-49294bd991c9"; } ];
+}
diff --git a/systems/x86_64-linux/shorthair/networking/default.nix b/systems/x86_64-linux/shorthair/networking/default.nix
new file mode 100644
index 0000000..694d5f9
--- /dev/null
+++ b/systems/x86_64-linux/shorthair/networking/default.nix
@@ -0,0 +1,8 @@
+{ lib, ... }:
+{
+
+  networking = {
+    hostname = "shorthair";
+    useDHCP = lib.mkDefault true;
+  };
+}