diff --git a/assets/wallpaper2.jpg b/assets/wallpaper2.jpg
new file mode 100644
index 0000000..ab0b16d
Binary files /dev/null and b/assets/wallpaper2.jpg differ
diff --git a/assets/wallpaper3.jpg b/assets/wallpaper3.jpg
new file mode 100644
index 0000000..8efdd50
Binary files /dev/null and b/assets/wallpaper3.jpg differ
diff --git a/assets/wallpaper4.jpg b/assets/wallpaper4.jpg
new file mode 100644
index 0000000..ca554c7
Binary files /dev/null and b/assets/wallpaper4.jpg differ
diff --git a/assets/wallpaper5.jpg b/assets/wallpaper5.jpg
new file mode 100644
index 0000000..a1d33a4
Binary files /dev/null and b/assets/wallpaper5.jpg differ
diff --git a/assets/wallpaper6.jpg b/assets/wallpaper6.jpg
new file mode 100644
index 0000000..67453a2
Binary files /dev/null and b/assets/wallpaper6.jpg differ
diff --git a/flake.lock b/flake.lock
index 4f0c26c..6e1a537 100644
--- a/flake.lock
+++ b/flake.lock
@@ -64,6 +64,24 @@
}
},
"flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ },
+ "locked": {
+ "lastModified": 1777988971,
+ "narHash": "sha256-qIoWPDs+0/8JecyYgE3gpKQxW/4bLW/gp45vow9ioCQ=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "0678d8986be1661af6bb555f3489f2fdfc31f6ff",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "flake-parts_2": {
"inputs": {
"nixpkgs-lib": [
"nixvim",
@@ -84,7 +102,7 @@
"type": "github"
}
},
- "flake-parts_2": {
+ "flake-parts_3": {
"inputs": {
"nixpkgs-lib": [
"terranix",
@@ -123,6 +141,30 @@
"type": "github"
}
},
+ "hm-wrapper-modules": {
+ "inputs": {
+ "home-manager": [
+ "home-manager"
+ ],
+ "nix-wrapper-modules": "nix-wrapper-modules",
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1774554164,
+ "narHash": "sha256-HzYleaTR4n4wejE7nyTcq7F1Kp4Q5ow//k/y0fiHNs0=",
+ "owner": "sini",
+ "repo": "hm-wrapper-modules",
+ "rev": "b28ff211a8cce758a98e0db349c0f3dd77a13373",
+ "type": "github"
+ },
+ "original": {
+ "owner": "sini",
+ "repo": "hm-wrapper-modules",
+ "type": "github"
+ }
+ },
"home-manager": {
"inputs": {
"nixpkgs": [
@@ -165,6 +207,21 @@
"type": "github"
}
},
+ "import-tree": {
+ "locked": {
+ "lastModified": 1773693634,
+ "narHash": "sha256-BtZ2dtkBdSUnFPPFc+n0kcMbgaTxzFNPv2iaO326Ffg=",
+ "owner": "vic",
+ "repo": "import-tree",
+ "rev": "c41e7d58045f9057880b0d85e1152d6a4430dbf1",
+ "type": "github"
+ },
+ "original": {
+ "owner": "vic",
+ "repo": "import-tree",
+ "type": "github"
+ }
+ },
"ixx": {
"inputs": {
"flake-utils": [
@@ -193,6 +250,27 @@
"type": "github"
}
},
+ "nix-wrapper-modules": {
+ "inputs": {
+ "nixpkgs": [
+ "hm-wrapper-modules",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1774538285,
+ "narHash": "sha256-KRDNQDEWjB2O5SRH/oUTzi34cNxlIT8sab0FK2uqZ2g=",
+ "owner": "BirdeeHub",
+ "repo": "nix-wrapper-modules",
+ "rev": "15d740b2bfc545189a569147da7718457c12758e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "BirdeeHub",
+ "repo": "nix-wrapper-modules",
+ "type": "github"
+ }
+ },
"nixos-apple-silicon": {
"inputs": {
"flake-compat": "flake-compat",
@@ -213,22 +291,6 @@
"type": "github"
}
},
- "nixos-unstable": {
- "locked": {
- "lastModified": 1768564909,
- "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "ref": "nixos-unstable",
- "repo": "nixpkgs",
- "type": "github"
- }
- },
"nixpkgs": {
"locked": {
"lastModified": 1757745802,
@@ -245,6 +307,21 @@
"type": "github"
}
},
+ "nixpkgs-lib": {
+ "locked": {
+ "lastModified": 1777168982,
+ "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "type": "github"
+ }
+ },
"nixpkgs-unstable": {
"locked": {
"lastModified": 1773628058,
@@ -295,23 +372,23 @@
},
"nixpkgs_4": {
"locked": {
- "lastModified": 1764517877,
- "narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
+ "lastModified": 1778274207,
+ "narHash": "sha256-I4puXmX1iovcCHZlRmztO3vW0mAbbRvq4F8wgIMQ1MM=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
+ "rev": "b3da656039dc7a6240f27b2ef8cc6a3ef3bccae7",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "nixos-unstable",
+ "ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixvim": {
"inputs": {
- "flake-parts": "flake-parts",
+ "flake-parts": "flake-parts_2",
"nixpkgs": [
"nixpkgs"
],
@@ -368,37 +445,21 @@
"url": "https://devimages-cdn.apple.com/design/resources/download/NY.dmg"
}
},
- "proton-pass-cli": {
- "inputs": {
- "nixpkgs": "nixpkgs_4"
- },
- "locked": {
- "lastModified": 1766050030,
- "narHash": "sha256-+jAjk7HyJ4aBo+JQODETpFFtpaXnUakcNx7ckBKhUkY=",
- "owner": "yuxqiu",
- "repo": "proton-pass-cli-nix",
- "rev": "db5bd21dfe19b31d62fb62a7441a4d4c35bdf747",
- "type": "github"
- },
- "original": {
- "owner": "yuxqiu",
- "repo": "proton-pass-cli-nix",
- "type": "github"
- }
- },
"root": {
"inputs": {
"apple-fonts": "apple-fonts",
"firefox-addons": "firefox-addons",
+ "flake-parts": "flake-parts",
+ "hm-wrapper-modules": "hm-wrapper-modules",
"home-manager": "home-manager",
+ "import-tree": "import-tree",
"nixos-apple-silicon": "nixos-apple-silicon",
- "nixos-unstable": "nixos-unstable",
"nixpkgs": "nixpkgs_3",
"nixpkgs-unstable": "nixpkgs-unstable",
"nixvim": "nixvim",
- "proton-pass-cli": "proton-pass-cli",
"sops-nix": "sops-nix",
"terranix": "terranix",
+ "wrapper-modules": "wrapper-modules",
"zen-browser": "zen-browser"
}
},
@@ -553,7 +614,7 @@
},
"terranix": {
"inputs": {
- "flake-parts": "flake-parts_2",
+ "flake-parts": "flake-parts_3",
"nixpkgs": [
"nixpkgs"
],
@@ -573,11 +634,29 @@
"type": "github"
}
},
+ "wrapper-modules": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_4"
+ },
+ "locked": {
+ "lastModified": 1778520701,
+ "narHash": "sha256-qEA/vR6fKwnW3lqwy7f+Ds1iPgdotKpksQIk6UZotlM=",
+ "owner": "BirdeeHub",
+ "repo": "nix-wrapper-modules",
+ "rev": "5660d8cada6c2c5eb6c034577f3893f579526804",
+ "type": "github"
+ },
+ "original": {
+ "owner": "BirdeeHub",
+ "repo": "nix-wrapper-modules",
+ "type": "github"
+ }
+ },
"zen-browser": {
"inputs": {
"home-manager": "home-manager_2",
"nixpkgs": [
- "nixos-unstable"
+ "nixpkgs-unstable"
]
},
"locked": {
diff --git a/flake.nix b/flake.nix
index 920b1ca..dfc2429 100644
--- a/flake.nix
+++ b/flake.nix
@@ -6,7 +6,10 @@
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable";
- nixos-unstable.url = "github:nixos/nixpkgs?ref=nixos-unstable";
+ flake-parts.url = "github:hercules-ci/flake-parts";
+ import-tree.url = "github:vic/import-tree";
+
+ wrapper-modules.url = "github:BirdeeHub/nix-wrapper-modules";
nixos-apple-silicon.url =
"github:nix-community/nixos-apple-silicon?ref=release-2025-11-18";
@@ -15,6 +18,9 @@
url = "github:nix-community/home-manager?ref=release-25.11";
inputs.nixpkgs.follows = "nixpkgs";
};
+ hm-wrapper-modules.url = "github:sini/hm-wrapper-modules";
+ hm-wrapper-modules.inputs.nixpkgs.follows = "nixpkgs";
+ hm-wrapper-modules.inputs.home-manager.follows = "home-manager";
nixvim = {
url = "github:nix-community/nixvim?ref=nixos-25.11";
@@ -35,7 +41,7 @@
url = "github:0xc000022070/zen-browser-flake";
# IMPORTANT: we're using "libgbm" and is only available in unstable so ensure
# to have it up-to-date or simply don't specify the nixpkgs input
- inputs.nixpkgs.follows = "nixos-unstable";
+ inputs.nixpkgs.follows = "nixpkgs-unstable";
};
firefox-addons = {
@@ -44,116 +50,70 @@
};
apple-fonts.url= "github:Lyndeno/apple-fonts.nix";
-
- proton-pass-cli.url = "github:yuxqiu/proton-pass-cli-nix";
-
};
- outputs = { self, nixpkgs, nixpkgs-unstable, nixos-unstable, nixos-apple-silicon, home-manager
- , nixvim, sops-nix, terranix, zen-browser, apple-fonts, proton-pass-cli, firefox-addons, ... }:
- let
- forAllSystems = function:
- nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed
- (system: function nixpkgs.legacyPackages.${system});
- in {
- packages.aarch64-linux =
- let
- system = "aarch64-linux";
+ outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs;} (inputs.import-tree ./modules);
- pkgs = import nixpkgs-unstable {
- inherit system;
- config = {
- allowUnfree = true;
- };
- };
-
- terraform = pkgs.terraform.withPlugins (p: [
- p.pocketid
- p.local
- ]);
- terraformConfiguration = terranix.lib.terranixConfiguration {
- inherit system;
- modules = [ ./infra/config.nix ];
- };
- in {
- deploy = pkgs.writeShellScriptBin "deploy" ''
- echo Deploying Infrastructure...
-
- export TF_VAR_pocketid_api_token=$(${pkgs.sops}/bin/sops -d --extract '["pocketid-api-token"]' secrets/secrets.yaml)
-
- cd infra
-
- cp ${terraformConfiguration} config.tf.json
-
- ${terraform}/bin/terraform init
- ${terraform}/bin/terraform apply
-
- rm -f config.tf.json
-
- echo Done
-
- echo Encrypting secrets
-
- cd ../secrets
-
- ${pkgs.sops}/bin/sops -e -i sops/oauth.yaml
-
- echo Done
- '';
- };
-
- nixosConfigurations = {
- max = let
- system = "aarch64-linux";
- pkgs-unstable = import nixpkgs-unstable { inherit system; };
- secrets = import ./secrets;
- in nixpkgs.lib.nixosSystem {
- inherit system;
- specialArgs = { inherit pkgs-unstable secrets zen-browser apple-fonts proton-pass-cli; };
- modules = [
- ./host/max/default.nix
- nixos-apple-silicon.nixosModules.apple-silicon-support
- sops-nix.nixosModules.sops
- home-manager.nixosModules.home-manager
- {
- home-manager.useGlobalPkgs = true;
- home-manager.useUserPackages = true;
- home-manager.extraSpecialArgs = { inherit secrets zen-browser firefox-addons system pkgs-unstable; };
- home-manager.users.max = { config, pkgs, lib, ... }: {
- imports = [
- sops-nix.homeManagerModules.sops
- nixvim.homeModules.nixvim
- zen-browser.homeModules.beta
- ./host/max/home.nix # Import your home.nix here
- ];
- };
- }
- ];
- };
-
- ark = let
- system = "x86_64-linux";
- secrets = import ./secrets;
- in nixos-unstable.lib.nixosSystem {
- inherit system;
- specialArgs = { inherit secrets; };
- modules = [
- ./host/ark/default.nix
- sops-nix.nixosModules.sops
- ];
- };
- };
-
- devShells = forAllSystems (pkgs: {
- default = pkgs.mkShell {
- packages = with pkgs; [
- age
- ssh-to-age
- sops
- just
- ];
- };
- });
- };
+ # outputs = { self, nixpkgs, nixpkgs-unstable, nixos-unstable, nixos-apple-silicon, home-manager
+ # , nixvim, sops-nix, terranix, zen-browser, apple-fonts, proton-pass-cli, firefox-addons, ... }:
+ # let
+ # forAllSystems = function:
+ # nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed
+ # (system: function nixpkgs.legacyPackages.${system});
+ # in {
+ #
+ # nixosConfigurations = {
+ # max = let
+ # system = "aarch64-linux";
+ # pkgs-unstable = import nixpkgs-unstable { inherit system; };
+ # secrets = import ./secrets;
+ # in nixpkgs.lib.nixosSystem {
+ # inherit system;
+ # specialArgs = { inherit pkgs-unstable secrets zen-browser apple-fonts proton-pass-cli; };
+ # modules = [
+ # ./host/max/default.nix
+ # nixos-apple-silicon.nixosModules.apple-silicon-support
+ # sops-nix.nixosModules.sops
+ # home-manager.nixosModules.home-manager
+ # {
+ # home-manager.useGlobalPkgs = true;
+ # home-manager.useUserPackages = true;
+ # home-manager.extraSpecialArgs = { inherit secrets zen-browser firefox-addons system pkgs-unstable; };
+ # home-manager.users.max = { config, pkgs, lib, ... }: {
+ # imports = [
+ # sops-nix.homeManagerModules.sops
+ # nixvim.homeModules.nixvim
+ # zen-browser.homeModules.beta
+ # ./host/max/home.nix # Import your home.nix here
+ # ];
+ # };
+ # }
+ # ];
+ # };
+ #
+ # ark = let
+ # system = "x86_64-linux";
+ # secrets = import ./secrets;
+ # in nixos-unstable.lib.nixosSystem {
+ # inherit system;
+ # specialArgs = { inherit secrets; };
+ # modules = [
+ # ./host/ark/default.nix
+ # sops-nix.nixosModules.sops
+ # ];
+ # };
+ # };
+ #
+ # devShells = forAllSystems (pkgs: {
+ # default = pkgs.mkShell {
+ # packages = with pkgs; [
+ # age
+ # ssh-to-age
+ # sops
+ # just
+ # ];
+ # };
+ # });
+ # };
}
diff --git a/home/common/optional/desktop/hyprland.nix b/home/common/optional/desktop/hyprland.nix
index 23de6f6..4bb441a 100644
--- a/home/common/optional/desktop/hyprland.nix
+++ b/home/common/optional/desktop/hyprland.nix
@@ -11,15 +11,8 @@ in
./hyprland/notifications.nix
];
- home.file.".config/waybar/config.jsonc".source = ./hyprland/waybar/config.jsonc;
- home.file.".config/waybar/style.css".source = ./hyprland/waybar/style.css;
- services.swayosd = {
- enable = true;
- };
- home.file.".config/swayosd/style.css".source = ./hyprland/swayosd/style.css;
- home.file.".config/walker/config.toml".source = ./hyprland/walker/config.toml;
}
diff --git a/home/common/optional/desktop/hyprland/hypridle.nix b/home/common/optional/desktop/hyprland/hypridle.nix
deleted file mode 100644
index 92fcbff..0000000
--- a/home/common/optional/desktop/hyprland/hypridle.nix
+++ /dev/null
@@ -1,27 +0,0 @@
-{ pkgs, scripts, ... }:
-{
- services.hypridle = {
- enable = true;
-
- settings = {
- general = {
- lock_cmd = "${scripts.lock}";
- before_sleep_cmd = "${pkgs.systemd}/bin/loginctl lock-session"; # lock before suspend.
- after_sleep_cmd = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
- inhibit_sleep = 3; # wait until screen is locked
- };
-
- listener = [
- {
- timeout = 60 * 5; # 5min
- on-timeout = "${pkgs.systemd}/bin/loginctl lock-session"; # lock screen when timeout has passed
- }
- {
- timeout = 60 * 5.5; # 5.5min
- on-timeout = "${pkgs.hyprland}/bin/hyprctl dispatch dpms off"; # screen off when timeout has passed
- on-resume = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on && brightnessctl -r"; # screen on when activity is detected
- }
- ];
- };
- };
-}
diff --git a/home/common/optional/desktop/hyprland/hyprlock.nix b/home/common/optional/desktop/hyprland/hyprlock.nix
deleted file mode 100644
index 0f6f1ce..0000000
--- a/home/common/optional/desktop/hyprland/hyprlock.nix
+++ /dev/null
@@ -1,58 +0,0 @@
-{ ... }:
-{
- programs.hyprlock = {
- enable = true;
-
- settings = {
- "$color" = "rgba(26,27,38,1.0)";
- "$inner_color" = "rgba(26,27,38,0.8)";
- "$outer_color" = "rgba(205,214,244,1.0)";
- "$font_color" = "rgba(205,214,244,1.0)";
- "$check_color" = "rgba(68, 157, 171, 1.0)";
-
- general = {
- ignore_empty_input = true;
- };
-
- background = {
- monitor = "";
- color = "$color";
- # path = "~/Downloads/wallpaper.png";
- blur_passes = 3;
- };
-
- animations = {
- enabled = true;
- };
-
- input-field = {
- monitor = "";
- size = "650, 100";
- position = "0, 0";
- halign = "center";
- valign = "center";
-
- inner_color = "$inner_color";
- outer_color = "$outer_color";
- outline_thickness = 4;
-
- font_family = "JetBrainsMono Nerd Font";
- font_color = "$font_color";
-
- placeholder_text = "Enter Password";
- check_color = "$check_color";
- fail_text = "$FAIL ($ATTEMPTS)";
-
- rounding = 0;
- shadow_passes = 0;
- fade_on_empty = false;
- };
-
- auth = {
- "fingerprint:enabled" = true;
- };
-
- };
-
- };
-}
diff --git a/home/common/optional/desktop/hyprland/notifications.nix b/home/common/optional/desktop/hyprland/notifications.nix
deleted file mode 100644
index 684c3e4..0000000
--- a/home/common/optional/desktop/hyprland/notifications.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- services.swaync = {
- enable = true;
-
- settings = {
- notification-window-width = 350;
- };
-
- # Taken from:
- # https://github.com/ErikReider/SwayNotificationCenter/blob/2083415ee6441acc272f46f8a43ebccae215f69a/data/style/style.scss#L4
- style = ''
- :root {
- --cc-bg: rgba(46, 46, 46, 0.7);
-
- --noti-border-color: rgba(255, 255, 255, 0.15);
- --noti-bg: 48, 48, 48;
- --noti-bg-alpha: 1;
-
- --border-radius: 0;
-
- --font-size-body: 13px;
- --font-size-summary: 14px;
- }
-
- .close-button {
- min-width: 18px;
- min-height: 18px;
- }
- '';
- };
-}
diff --git a/home/common/optional/desktop/hyprland/wallpaper.nix b/home/common/optional/desktop/hyprland/wallpaper.nix
deleted file mode 100644
index 27aea9d..0000000
--- a/home/common/optional/desktop/hyprland/wallpaper.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{ ... }:
-let
- wallpaper = builtins.toString ../../../../../assets/wallpaper.jpg;
-in
-{
- services.hyprpaper = {
- enable = true;
- settings = {
- spash = false;
-
- preload = [ wallpaper ];
-
- wallpaper = [
- "eDP-1,${wallpaper}"
- "HDMI-A-1,${wallpaper}"
- ];
- };
- };
-}
diff --git a/home/common/optional/desktop/plasma.nix b/home/common/optional/desktop/plasma.nix
deleted file mode 100644
index dc2e048..0000000
--- a/home/common/optional/desktop/plasma.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ ... }: {
- programs.plasma = {
- enable = true;
- workspace = { wallpaper = "/home/max/bg.jpg"; };
-
- kwin = { virtualDesktops = { number = 4; }; };
-
- input = {
- keyboard = {
- options = [ "caps:escape" ];
- layouts = [ { layout = "us"; } { layout = "cn"; } ];
- };
- };
- };
-}
-
diff --git a/host/common/core/default.nix b/host/common/core/default.nix
deleted file mode 100644
index a12dd83..0000000
--- a/host/common/core/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{ ... }: {
- time.timeZone = "America/New_York";
-
- # security.sudo.wheelNeedsPassword = false;
-
- nix.settings.experimental-features = [ "nix-command" "flakes" ];
-}
diff --git a/host/common/optional/browser.nix b/host/common/optional/browser.nix
deleted file mode 100644
index 9478be3..0000000
--- a/host/common/optional/browser.nix
+++ /dev/null
@@ -1,68 +0,0 @@
-{ lib, ... }: {
-
- programs.chromium = {
- enable = true;
- };
-
- programs.firefox = let
- lock-false = {
- Value = false;
- Status = "locked";
- };
- lock-true = {
- Value = true;
- Status = "locked";
- };
- lock-empty-string = {
- Value = "";
- Status = "locked";
- };
- in {
- enable = true;
- policies = {
- DisableTelemetry = true;
- DisableFirefoxStudies = true;
- DontCheckDefaultBrowser = true;
- DisablePocket = true;
- DisableAccounts = true;
-
- Preferences = {
- "extensions.pocket.enabled" = lock-false;
- "browser.topsites.contile.enabled" = lock-false;
- "browser.newtabpage.pinned" = lock-empty-string;
- "browser.newtabpage.activity-stream.showSponsored" = lock-false;
- "browser.newtabpage.activity-stream.system.showSponsored" = lock-false;
- "browser.newtabpage.activity-stream.showSponsoredTopSites" = lock-false;
- };
-
- ExtensionSettings = {
- "uBlock0@raymondhill.net" = {
- install_url =
- "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
- installation_mode = "force_installed";
- };
- "{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
- install_url =
- "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
- installation_mode = "force_installed";
- };
- "{d7742d87-e61d-4b78-b8a1-b469842139fa}" = {
- install_url =
- "https://addons.mozilla.org/firefox/downloads/latest/vimium-ff/latest.xpi";
- installation_mode = "force_installed";
- };
- "myallychou@gmail.com" = {
- install_url =
- "https://addons.mozilla.org/firefox/downloads/latest/youtube-recommended-videos/latest.xpi";
- installation_mode = "force_installed";
- };
-
- };
-
- UserMessaging = {
- UrlbarInterventions = false;
- SkipOnboarding = true;
- };
- };
- };
-}
diff --git a/host/common/optional/desktop/cosmic.nix b/host/common/optional/desktop/cosmic.nix
deleted file mode 100644
index 7103716..0000000
--- a/host/common/optional/desktop/cosmic.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{ ... }:
-{
- services.displayManager.cosmic-greeter.enable = true;
-
- services.desktopManager.cosmic.enable = true;
-}
diff --git a/host/common/optional/desktop/hyprland.nix b/host/common/optional/desktop/hyprland.nix
deleted file mode 100644
index 0e268d3..0000000
--- a/host/common/optional/desktop/hyprland.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{ ... }:
-{
- imports = [
- ./hyprland/cursor.nix
- ./hyprland/packages.nix
- ./hyprland/greeter.nix
- ./hyprland/hyprlock.nix
- ];
-
- programs.hyprland = {
- enable = true;
- withUWSM = true;
- xwayland.enable = true;
- };
-
- programs.ydotool.enable = true;
-}
diff --git a/host/common/optional/desktop/hyprland/cursor.nix b/host/common/optional/desktop/hyprland/cursor.nix
deleted file mode 100644
index 2bc6a40..0000000
--- a/host/common/optional/desktop/hyprland/cursor.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{ pkgs, lib, ... }:
-{
- nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
- "apple_cursor"
- ];
-
- environment.systemPackages = with pkgs; [
- apple-cursor
- ];
-}
diff --git a/host/common/optional/desktop/hyprland/greeter.nix b/host/common/optional/desktop/hyprland/greeter.nix
deleted file mode 100644
index 69ec4b5..0000000
--- a/host/common/optional/desktop/hyprland/greeter.nix
+++ /dev/null
@@ -1,12 +0,0 @@
-{ pkgs, ... }:
-{
- services.greetd = {
- enable = true;
- settings = {
- default_session = {
- command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd 'uwsm start hyprland-uwsm.desktop'";
- user = "greeter";
- };
- };
- };
-}
diff --git a/host/common/optional/desktop/hyprland/hyprlock.nix b/host/common/optional/desktop/hyprland/hyprlock.nix
deleted file mode 100644
index 3c6e8f4..0000000
--- a/host/common/optional/desktop/hyprland/hyprlock.nix
+++ /dev/null
@@ -1,4 +0,0 @@
-{ ... }:
-{
- security.pam.services.hyprlock = {};
-}
diff --git a/host/common/optional/desktop/hyprland/packages.nix b/host/common/optional/desktop/hyprland/packages.nix
deleted file mode 100644
index 55e3945..0000000
--- a/host/common/optional/desktop/hyprland/packages.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{ pkgs, ... }:
-{
- environment.systemPackages = with pkgs; [
- hyprpaper
- hypridle
- hyprpicker
- hyprsunset
- hyprshot
- waybar
- walker
- swayosd
-
- playerctl
- brightnessctl
- wl-clipboard
- wdisplays
-
- bluetui
-
- kdePackages.dolphin
- ];
-}
diff --git a/host/common/optional/desktop/plasma.nix b/host/common/optional/desktop/plasma.nix
deleted file mode 100644
index 707e2d5..0000000
--- a/host/common/optional/desktop/plasma.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ pkgs, ... }: {
- services = {
- desktopManager.plasma6.enable = true;
-
- displayManager.sddm.enable = true;
- displayManager.sddm.wayland.enable = true;
- };
-
- environment.systemPackages = with pkgs; [
- kdePackages.discover # Optional: Install if you use Flatpak or fwupd firmware update sevice
- kdePackages.kcalc # Calculator
- kdePackages.kcharselect # Tool to select and copy special characters from all installed fonts
- kdePackages.kcolorchooser # A small utility to select a color
- kdePackages.kolourpaint # Easy-to-use paint program
- kdePackages.ksystemlog # KDE SystemLog Application
- kdePackages.sddm-kcm # Configuration module for SDDM
- kdiff3 # Compares and merges 2 or 3 files or directories
- kdePackages.isoimagewriter # Optional: Program to write hybrid ISO files onto USB disks
- kdePackages.partitionmanager # Optional Manage the disk devices, partitions and file systems on your computer
- kdePackages.merkuro
- kdePackages.korganizer
- kdePackages.kdepim-addons
- hardinfo2 # System information and benchmarks for Linux systems
- haruna # Open source video player built with Qt/QML and libmpv
- wayland-utils # Wayland utilities
- wl-clipboard # Command-line copy/paste utilities for Wayland
- ];
-}
-
diff --git a/host/common/optional/email.nix b/host/common/optional/email.nix
deleted file mode 100644
index f047774..0000000
--- a/host/common/optional/email.nix
+++ /dev/null
@@ -1 +0,0 @@
-{ ... }: { programs.thunderbird.enable = true; }
diff --git a/host/common/optional/font.nix b/host/common/optional/font.nix
deleted file mode 100644
index 2784aa5..0000000
--- a/host/common/optional/font.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ pkgs, apple-fonts, ... }: {
- fonts = {
- fontconfig.defaultFonts = {
- sansSerif = [ "SF Pro" ];
- serif = [ "SF Pro" ];
- monospace = [ "JetBrainsMono Nerd Font" ];
- emoji = [ "Apple Color Emoji" ];
- };
-
- packages = with pkgs; [
- monocraft
- noto-fonts-cjk-sans
- nerd-fonts.jetbrains-mono
- (apple-fonts.packages.${pkgs.system}.sf-pro)
- (stdenv.mkDerivation {
- name = "apple-color-emoji";
- src = fetchurl {
- url =
- "https://github.com/samuelngs/apple-emoji-linux/releases/download/v17.4/AppleColorEmoji.ttf";
- sha256 = "1wahjmbfm1xgm58madvl21451a04gxham5vz67gqz1cvpi0cjva8";
- };
- dontUnpack = true;
- installPhase = ''
- install -Dm644 $src $out/share/fonts/truetype/AppleColorEmoji.ttf
- '';
- })
- ];
- };
-}
diff --git a/host/common/optional/locale.nix b/host/common/optional/locale.nix
deleted file mode 100644
index 1e22983..0000000
--- a/host/common/optional/locale.nix
+++ /dev/null
@@ -1,15 +0,0 @@
-{ pkgs, ... }: {
- i18n.defaultLocale = "en_US.UTF-8";
- i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" "zh_CN.UTF-8/UTF-8" ];
- i18n.inputMethod = {
- enable = true;
- type = "fcitx5";
- fcitx5.addons = with pkgs; [
- # fcitx5-gtk # alternatively, kdePackages.fcitx5-qt
- kdePackages.fcitx5-qt # alternatively, kdePackages.fcitx5-qt
- qt6Packages.fcitx5-chinese-addons # table input method support
- fcitx5-nord # a color theme
- ];
- };
-
-}
diff --git a/host/common/optional/proton.nix b/host/common/optional/proton.nix
deleted file mode 100644
index 24636c2..0000000
--- a/host/common/optional/proton.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{ pkgs, proton-pass-cli, config, ... }:
-let
- cache-path = "$HOME/.cache/pass";
-
- proton-pass = pkgs.writeShellScriptBin "pass-cli" ''
- export PROTON_PASS_KEY_PROVIDER="env"
- export PROTON_PASS_ENCRYPTION_KEY="${config.sops.secrets.proton_key.path}"
- exec ${proton-pass-cli.packages.${pkgs.system}.default}/bin/pass-cli "$@"
- '';
-
- pass-sync = pkgs.writeShellScriptBin "pass-sync" ''
- mkdir -p "${cache-path}"
- vaults=$(${proton-pass}/bin/pass-cli vault list --output json | ${pkgs.jq}/bin/jq '.vaults[].name' -r)
- for vault in $vaults; do
- ${proton-pass}/bin/pass-cli item list $vault --filter-state active --output json | ${pkgs.jq}/bin/jq '.items[].content.title' -r > "${cache-path}/$vault"
- done
- '';
-
- pass-fzf = pkgs.writeShellScriptBin "pass-fzf" ''
- selected=$(for f in ~/.cache/pass/*; do while IFS= read -r line; do echo "$(basename "$f"): $line"; done < "$f"; done | fzf)
- vault=$(echo "$selected" | cut -d':' -f1)
- item=$(echo "$selected" | cut -d':' -f2- | sed 's/^ //')
- ${proton-pass}/bin/pass-cli item view --vault-name "$vault" --item-title "$item" --output json | ${pkgs.jq}/bin/jq '.item.content.content.Login.password' | ${pkgs.wl-clipboard}/bin/wl-copy
- '';
-
-in {
- environment.systemPackages = [
- proton-pass
- pass-sync
- pass-fzf
- ];
-}
diff --git a/host/common/optional/syncthing.nix b/host/common/optional/syncthing.nix
deleted file mode 100644
index 6f4ef7b..0000000
--- a/host/common/optional/syncthing.nix
+++ /dev/null
@@ -1,20 +0,0 @@
-{ ... }:
-{
- services.syncthing = {
- enable = true;
- openDefaultPorts = true;
-
- settings = {
- devices = {
- "phone" = { id = "DBTMZ3P-VONFNYH-LDDNIO3-ZZ2TKO5-QFVV5D4-W4FMV67-HUTIJQB-UHNF3QM"; };
- };
-
- folders = {
- "Music" = {
- path = "/home/max/media/music";
- devices = [ "phone" ];
- };
- };
- };
- };
-}
diff --git a/host/common/optional/yubikey.nix b/host/common/optional/yubikey.nix
deleted file mode 100644
index 5c35151..0000000
--- a/host/common/optional/yubikey.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{ lib, pkgs, ... }:
-{
- environment.systemPackages = with pkgs; [
- yubioath-flutter # gui
- yubikey-manager # `ykman`
- pam_u2f # yubikey with sudo
- ];
-
- services.pcscd.enable = true;
- services.udev.packages = [ pkgs.yubikey-personalization ];
-
- services.yubikey-agent.enable = true;
-
- security.pam = {
- sshAgentAuth.enable = true;
- u2f = {
- enable = true;
- settings = {
- cue = true;
- authFile = "/home/max/.config/Yubico/u2f_keys";
- };
- };
- services = {
- login.u2fAuth = true;
- sudo = {
- u2fAuth = true;
- sshAgentAuth = true;
- };
- };
-
- };
-}
diff --git a/host/max/default.nix b/host/max/default.nix
index 9f13f7d..c391bbd 100644
--- a/host/max/default.nix
+++ b/host/max/default.nix
@@ -15,7 +15,6 @@
../common/optional/locale.nix
../common/optional/email.nix
../common/optional/proton.nix
- ../common/optional/syncthing.nix
];
# Use the systemd-boot EFI boot loader.
diff --git a/host/max/home/browser.nix b/host/max/home/browser.nix
deleted file mode 100644
index e463fa4..0000000
--- a/host/max/home/browser.nix
+++ /dev/null
@@ -1,157 +0,0 @@
-{ config, zen-browser, system, pkgs, firefox-addons, ... }:
-{
- xdg.mimeApps = let
- value = let
- browser = zen-browser.packages.${system}.beta; # or twilight
- in
- browser.meta.desktopFileName;
-
- associations = builtins.listToAttrs (map (name: {
- inherit name value;
- }) [
- "application/x-extension-shtml"
- "application/x-extension-xhtml"
- "application/x-extension-html"
- "application/x-extension-xht"
- "application/x-extension-htm"
- "x-scheme-handler/unknown"
- "x-scheme-handler/mailto"
- "x-scheme-handler/chrome"
- "x-scheme-handler/about"
- "x-scheme-handler/https"
- "x-scheme-handler/http"
- "application/xhtml+xml"
- "application/json"
- "text/plain"
- "text/html"
- ]);
- in {
- enable = true;
- associations.added = associations;
- defaultApplications = associations;
- };
-
- programs.zen-browser = {
- enable = true;
-
- policies = {
- AutofillAddressEnabled = false;
- AutofillCreditCardEnabled = false;
- DisableAppUpdate = true;
- DisableFeedbackCommands = true;
- DisableFirefoxStudies = true;
- DisablePocket = true;
- DisableTelemetry = true;
- DontCheckDefaultBrowser = true;
- NoDefaultBookmarks = true;
- OfferToSaveLogins = false;
- EnableTrackingProtection = {
- Value = true;
- Locked = true;
- Cryptomining = true;
- Fingerprinting = true;
- };
-
-
- # ID's can be collected from this command:
- # nix run github:tupakkatapa/mozid -- "https://addons.mozilla.org/en-US/firefox/addon//"
- ExtensionSettings = {
- # The default behaviour of ctrl+click, shift+click, cmd+click (on macOS) and middle-click when clicking on links is to open the link in a new tab (or new window in the case of shift).
- # This behaviour is sometimes broken by silly developers.
- "{18b670e2-67df-4b26-b9b0-34835d1f062a}" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/link-fixer/latest.xpi";
- installation_mode = "force_installed";
- };
- };
- };
-
- profiles.default = let
- containers = {
- Personal = {
- color = "yellow";
- icon = "circle";
- id = 1;
- };
- School = {
- color = "red";
- icon = "fruit";
- id = 2;
- };
- Work = {
- color = "blue";
- icon = "briefcase";
- id = 3;
- };
- };
- spaces = {
- Personal = {
- id = "c6de089c-410d-4206-961d-ab11f988d40a";
- icon = "⭐";
- container = containers."Personal".id;
- position = 1000;
- };
- School = {
- id = "78aabdad-8aae-4fe0-8ff0-2a0c6c4ccc24";
- icon = "🍎";
- container = containers."School".id;
- position = 2000;
- };
- Work = {
- id = "cdd10fab-4fc5-494b-9041-325e5759195b";
- icon = "💼";
- container = containers."Work".id;
- position = 3000;
- };
- };
- pins = {
- # Personal Pins
- "Proton Mail" = {
- id = "d9942e0a-0997-418d-b357-91727300d184";
- container = containers.Personal.id;
- url = "https://mail.proton.me";
- isEssential = true;
- position = 1;
- };
- "Proton Calendar" = {
- id = "6557e03f-c0ab-4656-ac94-acfb1fe19f3c";
- container = containers.Personal.id;
- url = "https://calendar.proton.me";
- isEssential = true;
- position = 2;
- };
- "YNAB" = {
- id = "10cb5609-fcd5-4ed6-a48d-24eb22f2d624";
- container = containers.Personal.id;
- url = "https://app.ynab.com";
- isEssential = true;
- position = 3;
- };
-
- # # School Pins
- # "Canvas" = {
- # id = "cfbdc143-6a16-46d7-b33e-e9c964725e59";
- # workspace = spaces.School.id;
- # container = containers.School.id;
- # url = "https://clemson.instructure.com/calendar";
- # isEssential = true;
- # position = 104;
- # };
- };
- in {
- containersForce = true;
- spacesForce = true;
- pinsForce = true;
- inherit containers spaces pins;
-
- # This is awesome :)
- # https://nur.nix-community.org/repos/rycee/
- extensions.packages = with firefox-addons.packages.${pkgs.stdenv.hostPlatform.system}; [
- ublock-origin
- proton-pass
- istilldontcareaboutcookies
- better-canvas
- darkreader
- ];
- };
- };
-}
diff --git a/host/max/home/browser/userChrome.css b/host/max/home/browser/userChrome.css
deleted file mode 100644
index da75be5..0000000
--- a/host/max/home/browser/userChrome.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.browserContainer > findbar {
- top: 0 !important;
- position: fixed !important;
- width: 1000px !important;
- right: 0 !important;
-}
diff --git a/host/max/home/git.nix b/host/max/home/git.nix
deleted file mode 100644
index f11e65c..0000000
--- a/host/max/home/git.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{ lib, ... }:
-let
- publicGitEmail = "22125083+k2on@users.noreply.github.com";
- publicKey = "/home/max/.ssh/id_maxkey.pub";
-in
-{
- programs.git = {
- enable = true;
- settings = {
- init.defaultBranch = "main";
- push.autoSetupRemote = true;
-
- commit.gpgsign = true;
- gpg.format = "ssh";
-
- user.name = "Max Koon";
- user.email = publicGitEmail;
- user.signing.key = publicKey;
- gpg.ssh.allowedSignersFile = "/home/max/.ssh/allowed_signers";
- };
-
- signing = {
- signByDefault = true;
- key = publicKey;
- };
- };
-
- home.file.".ssh/allowed_signers".text = ''
- ${publicGitEmail} ${lib.fileContents ../keys/id_maxkey.pub}
- '';
-}
diff --git a/host/max/home/image-viewer.nix b/host/max/home/image-viewer.nix
deleted file mode 100644
index 0001dfe..0000000
--- a/host/max/home/image-viewer.nix
+++ /dev/null
@@ -1,26 +0,0 @@
-{ pkgs, ... }:
-{
- xdg.desktopEntries.imv = {
- name = "imv";
- exec = "${pkgs.imv}/bin/imv %F";
- icon = "imv";
- };
-
- xdg.mimeApps = let
- value = "imv.desktop";
-
- associations = builtins.listToAttrs (map (name: {
- inherit name value;
- }) [
- "image/png"
- "image/jpeg"
- "image/gif"
- "image/bmp"
- "image/webp"
- ]);
- in {
- enable = true;
- associations.added = associations;
- defaultApplications = associations;
- };
-}
diff --git a/host/max/home/music.nix b/host/max/home/music.nix
deleted file mode 100644
index 150666d..0000000
--- a/host/max/home/music.nix
+++ /dev/null
@@ -1,45 +0,0 @@
-{ pkgs, ... }:
-{
- home.packages = with pkgs; [
- mpc
- ];
-
- services.mpd = {
- enable = true;
- musicDirectory = "/home/max/media/music";
-
- # extraConfig = ''
- # audio_output {
- # type "pipewire"
- # name "pipewire"
- # }
- # '';
-
-
- extraConfig = ''
- audio_output {
- type "alsa"
- name "My ALSA"
- mixer_type "hardware"
- mixer_device "default"
- mixer_control "PCM"
- }
- '';
-
- };
-
- services.mpd-mpris.enable = true;
-
- 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 = "J"; command = [ "select_item" "scroll_down" ]; }
- { key = "K"; command = [ "select_item" "scroll_up" ]; }
- ];
- };
-}
diff --git a/host/max/home/nvim.nix b/host/max/home/nvim.nix
deleted file mode 100644
index c58782b..0000000
--- a/host/max/home/nvim.nix
+++ /dev/null
@@ -1,282 +0,0 @@
-{ pkgs, ... }: {
- programs.nixvim = {
- enable = true;
-
- colorschemes.tokyonight.enable = true;
-
- globals = {
- mapleader = " ";
- maplocalleader = " ";
- };
-
- clipboard = {
- providers.wl-copy.enable = true;
- register = "unnamedplus";
- };
-
- opts = {
- background = "dark";
- relativenumber = true;
- cursorline = true;
- number = true;
-
- tabstop = 2;
- expandtab = true;
-
- signcolumn = "yes";
-
- updatetime = 250;
-
- list = true;
- listchars.__raw = "{ tab = '» ', trail = '·', nbsp = '␣' }";
-
- };
-
- extraConfigLua = ''
- vim.g.transparent_enabled = true
- require('transparent').setup({ exclude_groups = { "CursorLine" } })
- require('stay-centered').setup({ enable = true })
- require('mini.ai').setup()
- '';
-
- keymaps = [
- {
- mode = "n";
- key = "";
- action = "nohlsearch";
- }
- {
- mode = "n";
- key = "a";
- action.__raw = "function() require'harpoon':list():add() end";
- }
- {
- mode = "n";
- key = "";
- action.__raw =
- "function() require'harpoon'.ui:toggle_quick_menu(require'harpoon':list()) end";
- }
- {
- mode = "n";
- key = "";
- action.__raw = "function() require'harpoon':list():select(1) end";
- }
- {
- mode = "n";
- key = "";
- action.__raw = "function() require'harpoon':list():select(2) end";
- }
- {
- mode = "n";
- key = "";
- action.__raw = "function() require'harpoon':list():select(3) end";
- }
- {
- mode = "n";
- key = "";
- action.__raw = "function() require'harpoon':list():select(4) end";
- }
-
- {
- mode = "n";
- key = "b";
- action = "Neotree";
- }
- {
- mode = "n";
- key = "l";
- action = "Neotree reveal";
- }
- ];
-
- autoCmd = [
- {
- event = [ "BufWritePre" ];
- pattern = "*";
- command = "lua vim.lsp.buf.format()";
- }
- ];
-
- diagnostic.settings.virtual_text = true;
-
- userCommands.W.command = "w";
-
- plugins = {
-
- web-devicons.enable = true;
- sleuth.enable = true;
- lastplace.enable = true;
-
- gitsigns.enable = true;
- highlight-colors.enable = true;
- todo-comments.enable = true;
- goyo.enable = true;
-
- treesitter = {
- enable = true;
- settings = {
- ensureInstalled =
- [ "typescript" "rust" "php" "blade" "python" "nix" ];
-
- highlight = { enable = true; };
-
- indent = { enable = true; };
- };
- };
-
- lsp = {
- enable = true;
-
- servers = {
- tsgo.enable = true;
- tailwindcss.enable = false;
- biome.enable = false;
- rust_analyzer = {
- enable = true;
- installCargo = true;
- installRustc = true;
- };
- clangd.enable = true;
- phpactor.enable = true;
- pylsp.enable = true;
- pyright.enable = true;
- nixd.enable = true;
- };
-
- keymaps = {
- extra = [
- {
- mode = "n";
- key = "gd";
- action.__raw = "require('telescope.builtin').lsp_definitions";
- options = { desc = "LSP: [G]oto [D]efinition"; };
- }
- {
- mode = "n";
- key = "gr";
- action.__raw = "require('telescope.builtin').lsp_references";
- options = { desc = "LSP: [G]oto [R]eferences"; };
- }
- ];
-
- lspBuf = {
- "." = {
- mode = [ "n" "x" ];
- action = "code_action";
- desc = "Code action";
- };
- };
- };
- };
-
- lazydev.enable = true;
- luasnip.enable = true;
-
- telescope = {
- enable = true;
-
- extensions = {
- fzf-native.enable = true;
- ui-select.enable = true;
- };
-
- keymaps = {
- "sf" = {
- mode = "n";
- action = "find_files";
- options = { desc = "[S]earch [F]iles"; };
- };
- "sk" = {
- mode = "n";
- action = "live_grep";
- options = { desc = "[S]earch [S]tring"; };
- };
- };
- settings = {
- extensions.__raw =
- "{ ['ui-select'] = { require('telescope.themes').get_dropdown() } }";
- };
- };
-
- cmp = {
- enable = true;
- settings = {
- snippet = {
- expand = ''
- function(args)
- require('luasnip').lsp_expand(args.body)
- end
- '';
- };
-
- completion = { completeopt = "menu,menuone,noinsert"; };
- formatting = {
- format = ''require("nvim-highlight-colors").format'';
- };
- mapping = {
- "" = "cmp.mapping.confirm { select = true }";
- "" = "cmp.mapping.select_next_item()";
- "" = "cmp.mapping.select_prev_item()";
- "" = "cmp.mapping.select_next_item()";
- "" = "cmp.mapping.select_prev_item()";
- "" = "cmp.mapping.select_next_item()";
- "" = "cmp.mapping.select_prev_item()";
- };
- sources = [
- {
- name = "lazydev";
-
- group_index = 0;
- }
- { name = "nvim_lsp"; }
- { name = "luasnip"; }
- { name = "path"; }
- { name = "nvim_lsp_signature_help"; }
- ];
- };
- };
-
- harpoon = {
- enable = true;
- settings.settings = { save_on_toggle = true; };
- };
- neo-tree = {
- enable = true;
- settings = {
- window.width = 25;
- filesystem = {
- filtered_items = {
- visible = true;
- };
- };
- };
- };
- wakatime.enable = true;
- autoclose.enable = true;
- ts-autotag.enable = true;
- bullets.enable = true;
- spider = {
- enable = true;
- settings = {
- subwordMovement = true;
- skipInsignificantPunctuation = false;
- };
- keymaps = {
- motions = {
- "w" = "w";
- "e" = "e";
- "b" = "b";
- };
- };
- };
-
- transparent.enable = true;
- };
-
- extraPlugins = with pkgs.vimPlugins; [
- stay-centered-nvim
- mini-ai
- ];
-
- };
-}
diff --git a/host/max/home/sops.nix b/host/max/home/sops.nix
deleted file mode 100644
index 7cb30c0..0000000
--- a/host/max/home/sops.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{ ... }:
-{
- sops = {
-
- age.keyFile = "/home/max/.config/sops/age/keys.txt";
-
- defaultSopsFile = ../../../secrets/sops/host/max/default.yaml;
- validateSopsFiles = false;
-
- secrets = {
- "ssh_keys/max" = {
- path = "/home/max/.ssh/id_maxkey";
- };
- "waka_config" = {
- path = "/home/max/.wakatime.cfg";
- };
- };
- };
-}
diff --git a/host/max/home/ssh.nix b/host/max/home/ssh.nix
deleted file mode 100644
index bf13c78..0000000
--- a/host/max/home/ssh.nix
+++ /dev/null
@@ -1,45 +0,0 @@
-{ ... }:
-{
- programs.ssh = {
- enable = true;
-
- extraConfig = ''
- Host m1
- HostName m1
- User admin
-
- Host surface
- HostName surface
- User admin
-
- Host ark
- HostName ark
- User admin
-
- Host pi
- HostName 192.168.0.143
- User admin
-
- Host ssh.koon.us
- HostName ssh.koon.us
- ProxyCommand cloudflared access ssh --hostname %h
- User git
-
- AddKeysToAgent yes
- '';
-
- matchBlocks = {
- "git" = {
- host = "github.com";
- user = "git";
- identityFile = [
- "~/.ssh/id_maxkey"
- ];
- };
- };
- };
-
- home.file = {
- ".ssh/id_maxkey.pub".source = ../keys/id_maxkey.pub;
- };
-}
diff --git a/host/max/home/terminal.nix b/host/max/home/terminal.nix
deleted file mode 100644
index 4180473..0000000
--- a/host/max/home/terminal.nix
+++ /dev/null
@@ -1,137 +0,0 @@
-{ pkgs, config, ... }: {
- programs.alacritty = {
- enable = true;
- theme = "tokyo_night";
- settings = {
- window = {
- padding = { x = 14; y = 14; };
- };
- font = {
- normal.family = "JetBrainsMono Nerd Font";
- size = 10;
- };
- keyboard.bindings = [
- { key = "Insert"; mods = "Shift"; action = "Paste"; }
- { key = "Insert"; mods = "Control"; action = "Copy"; }
- ];
- };
- };
-
- programs.lf = { enable = true; };
-
- programs.tmux = {
- enable = true;
- mouse = true;
- keyMode = "vi";
- shell = "${pkgs.zsh}/bin/zsh";
- extraConfig = ''
- set -g status-style bg=default
-
- bind h select-pane -L
- bind j select-pane -D
- bind k select-pane -U
- bind l select-pane -R
-
- set -g default-terminal "tmux-256color"
- set -ga terminal-overrides ",alacritty:Tc"
- '';
- };
-
- programs.zsh = {
- enable = true;
- enableCompletion = true;
- autosuggestion = {
- enable = true;
- };
- syntaxHighlighting.enable = true;
- dotDir = "${config.home.homeDirectory}/.config/zsh";
- autocd = true;
-
- initContent = ''
- zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
- zstyle ':completion:*' menu select
-
- fzf-project() {
- selected=$(find ~/dev -mindepth 2 -maxdepth 2 | sed 's|/home/max/dev/||' | fzf --delimiter '/' --nth 2)
- if [[ -n $selected ]]; then
- cd ~/dev/$selected
- zle reset-prompt
- fi
- zle redisplay
- }
-
- zle -N fzf-project
- bindkey '^G' fzf-project
-
- fzf-files() {
- local selected
- selected=$(${pkgs.ripgrep}/bin/rg --files | ${pkgs.fzf}/bin/fzf) || return
-
- if [[ -n $selected ]]; then
- BUFFER="v $selected"
- print -s -- "$BUFFER"
- zle accept-line
- fi
- }
-
- zle -N fzf-files
- bindkey '^V' fzf-files
-
- open() {
- xdg-open "$@" >/dev/null 2>&1 &
- }
- '';
-
- envExtra = ''
- export PER_DIRECTORY_HISTORY_TOGGLE="^H"
- export HISTORY_BASE="$HOME/.local/share/directory_history"
- '';
-
- shellAliases = {
- ll = "ls -alh";
- v = "nvim";
- vi = "nvim";
- vim = "nvim";
-
- p = "pnpm";
- g = "pnpm run build && ~/dev/personal/genesis/packages/genesis/dist/bin.js";
-
- ns = "nix-shell --run zsh -p";
-
- tt = "tt -notheme -n 10";
-
- bible = "nvim ~/bible.txt -R";
- notes = "nvim ~/notes";
- home = "sudo nvim /etc/nixos/home.nix";
- wttr = "curl wttr.in/Clemson";
-
- docx-to-pdf = "libreoffice --headless --convert-to pdf";
- };
-
- plugins = [
- {
- name = "vi-mode";
- src = pkgs.zsh-vi-mode;
- file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh";
- }
- {
- name = "per-directory-history";
- src = pkgs.fetchFromGitHub {
- owner = "jimhester";
- repo = "per-directory-history";
- rev = "95f06973e9f2ff0ff75f3cebd0a2ee5485e27834";
- sha256 = "sha256-EV9QPBndwAWzdOcghDXrIIgP0oagVMOTyXzoyt8tXRo=";
- };
- }
- ];
- };
-
- programs.direnv = {
- enable = true;
- enableZshIntegration = true;
- nix-direnv.enable = true;
- silent = true;
- };
-
- programs.starship = { enable = true; };
-}
diff --git a/host/max/home/zathura.nix b/host/max/home/zathura.nix
deleted file mode 100644
index 81cea6a..0000000
--- a/host/max/home/zathura.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{ ... }: {
- programs.zathura = {
- enable = true;
- options = {
- selection-clipboard = "clipboard";
- };
- };
-}
diff --git a/host/max/sops.nix b/host/max/sops.nix
deleted file mode 100644
index 24df10f..0000000
--- a/host/max/sops.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{ config, lib, ... }:
-{
- sops = {
-
- age.keyFile = if builtins.pathExists /var/lib/sops-nix/key.txt then
- "/var/lib/sops-nix/key.txt"
- else
- "/home/max/.config/sops/age/keys.txt" # temp decrypt key
- ;
-
- defaultSopsFile = ../../secrets/sops/host/max/default.yaml;
- validateSopsFiles = false;
-
- secrets = {
- "host_age_key" = {
- path = "/var/lib/sops-nix/key.txt";
- };
- "yubico/u2f_keys" = {
- owner = config.users.users.max.name;
- inherit (config.users.users.max) group;
- path = "/home/max/.config/Yubico/u2f_keys";
- };
- "proton_key" = {};
- };
-
- };
-
- environment.sessionVariables.PROTON_PASS_ENCRYPTION_KEY = config.sops.secrets.proton_key.path;
-}
diff --git a/host/max/tailscale.nix b/host/max/tailscale.nix
deleted file mode 100644
index 9fcbbeb..0000000
--- a/host/max/tailscale.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ pkgs, ... }:
-{
- services.tailscale.enable = true;
-
- systemd.services.tailscale-restart = {
- description = "Restart Tailscale after waking up";
- after = [ "suspend.target" ];
- wantedBy = [ "suspend.target" ];
-
- serviceConfig = {
- Type = "simple";
- ExecStart = "${pkgs.systemd}/bin/systemctl restart tailscaled.service";
- };
- };
-}
-
diff --git a/host/max/user.nix b/host/max/user.nix
deleted file mode 100644
index 0ea771a..0000000
--- a/host/max/user.nix
+++ /dev/null
@@ -1,24 +0,0 @@
-{ pkgs, config, ... }: {
-
- sops.secrets.max-password.neededForUsers = true;
- users.mutableUsers = false;
-
- users.users.max = {
- isNormalUser = true;
- hashedPasswordFile = config.sops.secrets.max-password.path;
- extraGroups = [ "wheel" "networkmanager" "video" "kvm" "docker" "ydotool" ];
- packages = with pkgs; [ tree ];
- shell = pkgs.zsh;
- };
-
- programs.adb.enable = true;
-
- virtualisation.docker = {
- enable = true;
-
- rootless = {
- enable = true;
- setSocketVariable = true;
- };
- };
-}
diff --git a/host/max/work.nix b/host/max/work.nix
deleted file mode 100644
index 966f70b..0000000
--- a/host/max/work.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{ config, secrets, ... }: {
-
-
- services.openvpn.servers = {
- ris = {
- config = "config /etc/openvpn/ris/config.ovpn ";
- updateResolvConf = true;
- autoStart = false;
- };
- };
-
- sops.secrets = {
- "ris-vpn/key" = {
- sopsFile = ../../secrets/sops/host/max/work.yaml;
- owner = config.users.users.root.name;
- inherit (config.users.users.root) group;
- path = "/etc/openvpn/ris/vpnclient.rismedia.com.key";
- };
- };
-
- environment.etc."openvpn/ris/config.ovpn" = {
- text = secrets.work.ris.vpn.config;
- };
- environment.etc."openvpn/ris/vpnclient.rismedia.com.crt" = {
- text = secrets.work.ris.vpn.crt;
- };
-
- networking.extraHosts = ''
- ${secrets.work.ris.extraHosts}
- '';
-}
diff --git a/infra/.terraform.lock.hcl b/infra/.terraform.lock.hcl
deleted file mode 100644
index aa0ed95..0000000
--- a/infra/.terraform.lock.hcl
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is maintained automatically by "terraform init".
-# Manual edits may be lost in future updates.
-
-provider "registry.terraform.io/hashicorp/local" {
- version = "2.5.3"
- hashes = [
- "h1:6ADVoHtXiWFhClkKa1vnBycJxqnL0GjHMZAQipa4SEU=",
- ]
-}
-
-provider "registry.terraform.io/trozz/pocketid" {
- version = "0.1.5"
- hashes = [
- "h1:egwnwPepmLF/OAE96D7RxGlsXYlUVZi3CuFhAH69iVE=",
- ]
-}
diff --git a/infra/config.nix b/infra/config.nix
deleted file mode 100644
index b48da62..0000000
--- a/infra/config.nix
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- terraform = {
- required_providers = {
- pocketid = {
- source = "trozz/pocketid";
- };
- };
- };
- provider.pocketid = {
- base_url = "https://auth.koon.us";
- api_token = "\${var.pocketid_api_token}";
- };
-
- variable.pocketid_api_token = {
- type = "string";
- sensitive = true;
- description = "PocketID API token";
- };
-
- resource.pocketid_client.photos = {
- name = "Photos";
- callback_urls = [
- "https://photos.koon.us/auth/login"
- "https://photos.koon.us/user-settings"
- "app.immich:///oauth-callback"
- ];
- is_public = false;
- pkce_enabled = false;
- };
-
- resource.pocketid_client.git = {
- name = "Git";
- callback_urls = [
- "https://git.koon.us/user/oauth2/KoonFamily/callback"
- ];
- is_public = false;
- pkce_enabled = false;
- };
-
- resource.pocketid_client.docs = {
- name = "Docs";
- callback_urls = [
- "https://docs.koon.us/*"
- ];
- is_public = false;
- pkce_enabled = false;
- };
-
- output = {
- photos_client_id = {
- value = "\${pocketid_client.photos.id}";
- };
-
- photos_client_secret = {
- value = "\${pocketid_client.photos.client_secret}";
- sensitive = true;
- };
-
- git_client_id = {
- value = "\${pocketid_client.git.id}";
- };
-
- git_client_secret = {
- value = "\${pocketid_client.git.client_secret}";
- sensitive = true;
- };
-
- docs_client_id = {
- value = "\${pocketid_client.docs.id}";
- };
-
- docs_client_secret = {
- value = "\${pocketid_client.docs.client_secret}";
- sensitive = true;
- };
- };
-
- resource.local_file.oauth_config = {
- filename = "\${path.module}/../secrets/sops/oauth.yaml";
- content = ''
- photos:
- clientId: ''${pocketid_client.photos.id}
- clientSecret: ''${pocketid_client.photos.client_secret}
- git:
- clientId: ''${pocketid_client.git.id}
- clientSecret: ''${pocketid_client.git.client_secret}
- docs:
- clientId: ''${pocketid_client.docs.id}
- clientSecret: ''${pocketid_client.docs.client_secret}
- '';
- file_permission = "0600";
- };
-}
diff --git a/justfile b/justfile
index e92ec57..0ce79d0 100644
--- a/justfile
+++ b/justfile
@@ -11,19 +11,19 @@ rebuild:
just add-secrets
git add .
- sudo nixos-rebuild switch --flake '.?submodules=1#max'
+ sudo nixos-rebuild switch --flake '.?submodules=1#koonMax'
rebuild-boot:
just add-secrets
git add .
- sudo nixos-rebuild boot --flake '.?submodules=1#max'
+ sudo nixos-rebuild boot --flake '.?submodules=1#koonMax'
rebuild-offline:
just add-secrets
git add .
- sudo nixos-rebuild switch --flake '.?submodules=1#max' --offline
+ sudo nixos-rebuild switch --flake '.?submodules=1#koonMax' --offline
rebuild-ark:
just add-secrets
diff --git a/modules/common/features/development/alacritty.nix b/modules/common/features/development/alacritty.nix
new file mode 100644
index 0000000..957470f
--- /dev/null
+++ b/modules/common/features/development/alacritty.nix
@@ -0,0 +1,21 @@
+{ ... }: {
+ flake.homeModules.commonFeatureAlacritty = { ... }: {
+ programs.alacritty = {
+ enable = true;
+ theme = "tokyo_night";
+ settings = {
+ window = {
+ padding = { x = 14; y = 14; };
+ };
+ font = {
+ normal.family = "JetBrainsMono Nerd Font";
+ size = 10;
+ };
+ keyboard.bindings = [
+ { key = "Insert"; mods = "Shift"; action = "Paste"; }
+ { key = "Insert"; mods = "Control"; action = "Copy"; }
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/common/features/development/direnv.nix b/modules/common/features/development/direnv.nix
new file mode 100644
index 0000000..90bda93
--- /dev/null
+++ b/modules/common/features/development/direnv.nix
@@ -0,0 +1,10 @@
+{ ... }: {
+ flake.homeModules.commonFeatureDirenv = { ... }: {
+ programs.direnv = {
+ enable = true;
+ enableZshIntegration = true;
+ nix-direnv.enable = true;
+ silent = true;
+ };
+ };
+}
diff --git a/modules/common/features/development/lf.nix b/modules/common/features/development/lf.nix
new file mode 100644
index 0000000..6d83078
--- /dev/null
+++ b/modules/common/features/development/lf.nix
@@ -0,0 +1,5 @@
+{ ... }: {
+ flake.homeModules.commonFeatureLf = { ... }: {
+ programs.lf = { enable = true; };
+ };
+}
diff --git a/modules/common/features/development/starship.nix b/modules/common/features/development/starship.nix
new file mode 100644
index 0000000..8b22843
--- /dev/null
+++ b/modules/common/features/development/starship.nix
@@ -0,0 +1,6 @@
+{ ... }: {
+ flake.homeModules.commonFeatureStarship = { ... }: {
+ programs.starship.enable = true;
+ };
+}
+
diff --git a/modules/common/features/development/tmux.nix b/modules/common/features/development/tmux.nix
new file mode 100644
index 0000000..7184c33
--- /dev/null
+++ b/modules/common/features/development/tmux.nix
@@ -0,0 +1,21 @@
+{ ... }: {
+ flake.homeModules.commonFeatureTmux = { pkgs, ... }: {
+ programs.tmux = {
+ enable = true;
+ mouse = true;
+ keyMode = "vi";
+ shell = "${pkgs.zsh}/bin/zsh";
+ extraConfig = ''
+ set -g status-style bg=default
+
+ bind h select-pane -L
+ bind j select-pane -D
+ bind k select-pane -U
+ bind l select-pane -R
+
+ set -g default-terminal "tmux-256color"
+ set -ga terminal-overrides ",alacritty:Tc"
+ '';
+ };
+ };
+}
diff --git a/modules/common/features/development/zsh.nix b/modules/common/features/development/zsh.nix
new file mode 100644
index 0000000..567cf17
--- /dev/null
+++ b/modules/common/features/development/zsh.nix
@@ -0,0 +1,92 @@
+{ ... }: {
+ flake.homeModules.commonFeatureZsh = { pkgs, config, ... }: {
+ programs.zsh = {
+ enable = true;
+ enableCompletion = true;
+ autosuggestion = {
+ enable = true;
+ };
+ syntaxHighlighting.enable = true;
+ dotDir = "${config.home.homeDirectory}/.config/zsh";
+ autocd = true;
+
+ initContent = ''
+ zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
+ zstyle ':completion:*' menu select
+
+ fzf-project() {
+ selected=$(find ~/dev -mindepth 2 -maxdepth 2 | sed 's|/home/max/dev/||' | fzf --delimiter '/' --nth 2)
+ if [[ -n $selected ]]; then
+ cd ~/dev/$selected
+ zle reset-prompt
+ fi
+ zle redisplay
+ }
+
+ zle -N fzf-project
+ bindkey '^G' fzf-project
+
+ fzf-files() {
+ local selected
+ selected=$(${pkgs.ripgrep}/bin/rg --files | ${pkgs.fzf}/bin/fzf) || return
+
+ if [[ -n $selected ]]; then
+ BUFFER="v $selected"
+ print -s -- "$BUFFER"
+ zle accept-line
+ fi
+ }
+
+ zle -N fzf-files
+ bindkey '^V' fzf-files
+
+ open() {
+ xdg-open "$@" >/dev/null 2>&1 &
+ }
+ '';
+
+ envExtra = ''
+ export PER_DIRECTORY_HISTORY_TOGGLE="^H"
+ export HISTORY_BASE="$HOME/.local/share/directory_history"
+ '';
+
+ shellAliases = {
+ ll = "ls -alh";
+ v = "nvim";
+ vi = "nvim";
+ vim = "nvim";
+
+ p = "pnpm";
+ g = "pnpm run build && ~/dev/personal/genesis/packages/genesis/dist/bin.js";
+
+ ns = "nix-shell --run zsh -p";
+
+ tt = "tt -notheme -n 10";
+
+ bible = "nvim ~/bible.txt -R";
+ notes = "nvim ~/notes";
+ home = "sudo nvim /etc/nixos/home.nix";
+ wttr = "curl wttr.in/Clemson";
+
+ docx-to-pdf = "libreoffice --headless --convert-to pdf";
+ };
+
+ plugins = [
+ {
+ name = "vi-mode";
+ src = pkgs.zsh-vi-mode;
+ file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh";
+ }
+ {
+ name = "per-directory-history";
+ src = pkgs.fetchFromGitHub {
+ owner = "jimhester";
+ repo = "per-directory-history";
+ rev = "95f06973e9f2ff0ff75f3cebd0a2ee5485e27834";
+ sha256 = "sha256-EV9QPBndwAWzdOcghDXrIIgP0oagVMOTyXzoyt8tXRo=";
+ };
+ }
+ ];
+ };
+ };
+}
diff --git a/modules/common/features/email.nix b/modules/common/features/email.nix
new file mode 100644
index 0000000..d100526
--- /dev/null
+++ b/modules/common/features/email.nix
@@ -0,0 +1,6 @@
+{ ... }: {
+ flake.nixosModules.commonFeatureEmail = { ... }: {
+ programs.thunderbird.enable = true;
+ };
+}
+
diff --git a/modules/common/features/font.nix b/modules/common/features/font.nix
new file mode 100644
index 0000000..de388bc
--- /dev/null
+++ b/modules/common/features/font.nix
@@ -0,0 +1,32 @@
+{ ... }: {
+ flake.nixosModules.commonFeatureFont = { pkgs, ... }: {
+ fonts = {
+ fontconfig.defaultFonts = {
+ sansSerif = [ "SF Pro" ];
+ serif = [ "SF Pro" ];
+ monospace = [ "JetBrainsMono Nerd Font" ];
+ emoji = [ "Apple Color Emoji" ];
+ };
+
+ packages = with pkgs; [
+ monocraft
+ noto-fonts-cjk-sans
+ nerd-fonts.jetbrains-mono
+ # (apple-fonts.packages.${pkgs.system}.sf-pro)
+ (stdenv.mkDerivation {
+ name = "apple-color-emoji";
+ src = fetchurl {
+ url =
+ "https://github.com/samuelngs/apple-emoji-linux/releases/download/v17.4/AppleColorEmoji.ttf";
+ sha256 = "1wahjmbfm1xgm58madvl21451a04gxham5vz67gqz1cvpi0cjva8";
+ };
+ dontUnpack = true;
+ installPhase = ''
+ install -Dm644 $src $out/share/fonts/truetype/AppleColorEmoji.ttf
+ '';
+ })
+ ];
+ };
+ };
+}
+
diff --git a/modules/common/features/hyprland-config.nix b/modules/common/features/hyprland-config.nix
new file mode 100644
index 0000000..b6d262b
--- /dev/null
+++ b/modules/common/features/hyprland-config.nix
@@ -0,0 +1,351 @@
+{ ... }: {
+ flake.homeModules.commonFeatureHyprlandConfig = { pkgs, ... }: {
+ wayland.windowManager.hyprland = {
+ enable = true;
+ systemd.enable = false;
+
+ plugins = with pkgs; [
+ (hyprlandPlugins.mkHyprlandPlugin {
+ pluginName = "hyprselect";
+ version = "0.1";
+ src = fetchFromGitHub {
+ owner = "jmanc3";
+ repo = "hyprselect";
+ rev = "f9651b5fd64c730ee164a6fee6a08d0398dcbe0a";
+ hash = "sha256-tY8EdfsjlUOuQ9v/POqpyLlkRO5wqEVSE9UeHfXuaGk=";
+ };
+
+ inherit (hyprland) nativeBuildInputs;
+
+ meta = with lib; {
+ homepage = "https://github.com/jmanc3/hyprselect";
+ description = "A plugin that adds a completely useless desktop selection box to Hyprland";
+ license = licenses.unlicense;
+ platforms = platforms.linux;
+ };
+ })
+ hyprlandPlugins.hyprscrolling
+ # hyprlandPlugins.hyprbars
+ ];
+
+ settings = {
+ # source = [
+ # "~/.config/koonos/current/performance/hyprland.conf"
+ # ];
+
+ "$terminal" = "${pkgs.uwsm}/bin/uwsm-app -- ${pkgs.alacritty}/bin/alacritty";
+ "$fileManager" = "${pkgs.uwsm}/bin/uwsm-app -- ${pkgs.pcmanfm}/bin/pcmanfm";
+ "$browser" = "${pkgs.uwsm}/bin/uwsm-app -- zen-beta";
+ "$menu" = "${pkgs.walker}/bin/walker";
+ "$player" = "${pkgs.playerctl}/bin/playerctl";
+
+ monitor = [
+ "eDP-1,preferred,1721x1080,auto"
+ "HDMI-A-1,preferred,1450x0,auto"
+ ];
+
+ exec-once = [
+ "${pkgs.uwsm}/bin/uwsm-app -- ${pkgs.hypridle}/bin/hypridle"
+ "${pkgs.uwsm}/bin/uwsm-app -- ${pkgs.waybar}/bin/waybar"
+ "${pkgs.uwsm}/bin/uwsm-app -- ${pkgs.hyprpaper}/bin/hyprpaper"
+ "sleep 2 && pw-play --volume=0 ~/Downloads/empty.wav"
+ ];
+
+ env = [
+ "HYPRCURSOR_THEME,macOS"
+ "HYPRCURSOR_SIZE,20"
+ ];
+
+ # env = [
+ # "XCURSOR_SIZE,20"
+ # "XCURSOR_THEME,macOS"
+ # ];
+
+ general = {
+ gaps_in = 0;
+ gaps_out = 0;
+
+ border_size = 2;
+
+ "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
+ "col.inactive_border" = "rgba(595959aa)";
+
+ # Set to true enable resizing windows by clicking and dragging on borders and gaps
+ resize_on_border = true;
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false;
+
+ layout = "master";
+ };
+
+ decoration = {
+ # rounding = 10
+ # rounding_power = 2
+
+ # Change transparency of focused and unfocused windows
+ active_opacity = 1.0;
+ inactive_opacity = 1.0;
+
+ shadow = {
+ # enabled = false;
+ range = 4;
+ render_power = 3;
+ color = "rgba(1a1a1aee)";
+ };
+
+ # https://wiki.hyprland.org/Configuring/Variables/#blur
+ blur = {
+ # enabled = false;
+ size = 3;
+ passes = 1;
+
+ vibrancy = 0.1696;
+ };
+ };
+
+
+ # https://wiki.hyprland.org/Configuring/Variables/#animations
+ animations = {
+ enabled = true;
+
+ # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+ bezier = [
+ "easeOutQuint,0.23,1,0.32,1"
+ "easeInOutCubic,0.65,0.05,0.36,1"
+ "linear,0,0,1,1"
+ "almostLinear,0.5,0.5,0.75,1.0"
+ "quick,0.15,0,0.1,1"
+
+ ];
+
+ animation = [
+ "global, 1, 10, default"
+ "border, 0, 5.39, easeOutQuint"
+ "windows, 1, 4.79, easeOutQuint"
+ "windowsIn, 1, 4.1, easeOutQuint, popin 87%"
+ "windowsOut, 1, 1.49, linear, popin 87%"
+ "fadeIn, 1, 1.73, almostLinear"
+ "fadeOut, 1, 1.46, almostLinear"
+ "fade, 1, 3.03, quick"
+ "layers, 1, 3.81, easeOutQuint"
+ "layersIn, 1, 4, easeOutQuint, fade"
+ "layersOut, 1, 1.5, linear, fade"
+ "fadeLayersIn, 1, 1.79, almostLinear"
+ "fadeLayersOut, 1, 1.39, almostLinear"
+ "workspaces, 0, 1.94, almostLinear, fade"
+ "workspacesIn, 0, 1.21, almostLinear, fade"
+ "workspacesOut, 0, 1.94, almostLinear, fade"
+ ];
+ };
+
+
+ dwindle = {
+ pseudotile = true; # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true; # You probably want this
+ };
+
+ # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+ master = {
+ new_status = "master";
+ };
+
+ # https://wiki.hyprland.org/Configuring/Variables/#misc
+ misc = {
+ force_default_wallpaper = 0; # Set to 0 or 1 to disable the anime mascot wallpapers
+ disable_hyprland_logo = true;
+ disable_splash_rendering = true;
+ };
+
+
+ #############
+ ### INPUT ###
+ #############
+
+ # https://wiki.hyprland.org/Configuring/Variables/#input
+ input = {
+ kb_layout = "us";
+ # kb_variant =
+ # kb_model =
+ kb_options = "caps:swapescape";
+ # kb_rules =
+
+ follow_mouse = 1;
+
+ sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
+ repeat_rate = 35;
+ repeat_delay = 300;
+
+ touchpad = {
+ natural_scroll = true;
+ tap-to-click = false;
+ clickfinger_behavior = true;
+ };
+ };
+
+ # https://wiki.hyprland.org/Configuring/Variables/#gestures
+ # gestures = {
+ # workspace_swipe = true;
+ # };
+
+ # See https://wiki.hyprland.org/Configuring/Keywords/
+ "$mainMod" = "SUPER"; # Sets "Windows" key as main modifier
+ bind = [
+
+ # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
+ "$mainMod, return, exec, $terminal"
+ "$mainMod, W, killactive,"
+ # bind = $mainMod, M, exit,
+ "$mainMod, E, exec, $fileManager"
+ "$mainMod, B, exec, $browser"
+
+ # "$mainMod, M, exec, $terminal -e ${pkgs-unstable.gurk-rs}/bin/gurk"
+ "$mainMod, P, exec, $terminal -e ${pkgs.ncmpcpp}/bin/ncmpcpp"
+ "$mainMod SHIFT, B, exec, $terminal -e \"$EDITOR\" /home/max/bible.txt -R"
+ "$mainMod SHIFT, R, exec, ${pkgs.hyprshot}/bin/hyprshot -m region --clipboard-only"
+
+ # "$mainMod, V, togglefloating,"
+ "$mainMod, space, exec, $menu"
+ # "$mainMod, P, pseudo, # dwindle"
+ "$mainMod, F, fullscreen"
+ # bind = $mainMod, J, togglesplit, # dwindle
+
+ "$mainMod SHIFT, Q, exec, ${pkgs.hyprlock}/bin/hyprlock"
+
+ # Move focus with mainMod + arrow keys
+ "$mainMod, H, movefocus, l"
+ "$mainMod, L, movefocus, r"
+ "$mainMod, K, movefocus, u"
+ "$mainMod, J, movefocus, d"
+
+ # Swap window with mainMod + shift + arrow keys
+ "$mainMod SHIFT, H, swapwindow, l"
+ "$mainMod SHIFT, L, swapwindow, r"
+ "$mainMod SHIFT, K, swapwindow, u"
+ "$mainMod SHIFT, J, swapwindow, d"
+
+ # "$mainMod ALT, H, resizeactive, -40 0"
+ # "$mainMod ALT, L, resizeactive, 40 0"
+
+ # Switch workspaces with mainMod + [0-9]
+ "$mainMod, 1, workspace, 1"
+ "$mainMod, 2, workspace, 2"
+ "$mainMod, 3, workspace, 3"
+ "$mainMod, 4, workspace, 4"
+ "$mainMod, 5, workspace, 5"
+ "$mainMod, 6, workspace, 6"
+ "$mainMod, 7, workspace, 7"
+ "$mainMod, 8, workspace, 8"
+ "$mainMod, 9, workspace, 9"
+ "$mainMod, 0, workspace, 10"
+
+ # Move active window to a workspace with mainMod + SHIFT + [0-9]
+ "$mainMod SHIFT, 1, movetoworkspace, 1"
+ "$mainMod SHIFT, 2, movetoworkspace, 2"
+ "$mainMod SHIFT, 3, movetoworkspace, 3"
+ "$mainMod SHIFT, 4, movetoworkspace, 4"
+ "$mainMod SHIFT, 5, movetoworkspace, 5"
+ "$mainMod SHIFT, 6, movetoworkspace, 6"
+ "$mainMod SHIFT, 7, movetoworkspace, 7"
+ "$mainMod SHIFT, 8, movetoworkspace, 8"
+ "$mainMod SHIFT, 9, movetoworkspace, 9"
+ "$mainMod SHIFT, 0, movetoworkspace, 10"
+
+ # Example special workspace (scratchpad)
+ "$mainMod, S, togglespecialworkspace, magic"
+ "$mainMod SHIFT, S, movetoworkspace, special:magic"
+
+ # Scroll through existing workspaces with mainMod + scroll
+ # "$mainMod, mouse_down, workspace, e+1"
+ # "$mainMod, mouse_up, workspace, e-1"
+
+ # ", Prior, exec, ${pkgs.ydotool}/bin/ydotool click --next-delay 0 0x40"
+ # ", Next, exec, ${pkgs.ydotool}/bin/ydotool click --next-delay 0 0x41"
+ ];
+
+ # bindr = [
+ # ", Prior, exec, ${pkgs.ydotool}/bin/ydotool click --next-delay 0 0x80"
+ # ", Next, exec, ${pkgs.ydotool}/bin/ydotool click --next-delay 0 0x81"
+ # ];
+
+ # Move/resize windows with mainMod + LMB/RMB and dragging
+ bindm = [
+ "$mainMod, mouse:272, movewindow"
+ "$mainMod, mouse:273, resizewindow"
+ ];
+
+ "$osdclient" = "swayosd-client --monitor \"$(hyprctl monitors -j | ${pkgs.jq}/bin/jq -r '.[] | select(.focused == true).name')\"";
+
+ bindel = [
+ # Laptop multimedia keys for volume and LCD brightness
+ # bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
+ # bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+ ",XF86AudioRaiseVolume, exec, $osdclient --output-volume=raise"
+ ",XF86AudioLowerVolume, exec, $osdclient --output-volume=lower"
+ ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+ ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+ # bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
+ # bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
+ ",XF86MonBrightnessUp, exec, $osdclient --brightness=raise"
+ ",XF86MonBrightnessDown, exec, $osdclient --brightness=lower"
+ ];
+
+ bindl = [
+ # Requires playerctl
+ ", XF86AudioNext, exec, $player next"
+ ", XF86AudioPause, exec, $player play-pause" ", XF86AudioPlay, exec, $player play-pause"
+ ", XF86AudioPrev, exec, $player previous"
+ ];
+
+ bindd = [
+ "$mainMod, C, Universal copy, sendshortcut, CTRL, Insert,"
+ "$mainMod, V, Universal paste, sendshortcut, SHIFT, Insert,"
+ "$mainMod, X, Universal cut, sendshortcut, CTRL, X,"
+ "$mainMod, A, Universal select all, sendshortcut, CTRL, A,"
+ "$mainMod, T, Universal new tab, sendshortcut, CTRL, T,"
+
+ "$mainMod ALT, H, Universal left, sendshortcut, , Left,"
+ "$mainMod ALT, J, Universal down, sendshortcut, , Down,"
+ "$mainMod ALT, K, Universal up, sendshortcut, , Up,"
+ "$mainMod ALT, L, Universal right, sendshortcut, , Right,"
+
+ "$mainMod SHIFT ALT, H, Universal left, sendshortcut, SHIFT, Left,"
+ "$mainMod SHIFT ALT, J, Universal down, sendshortcut, SHIFT, Down,"
+ "$mainMod SHIFT ALT, K, Universal up, sendshortcut, SHIFT, Up,"
+ "$mainMod SHIFT ALT, L, Universal right, sendshortcut, SHIFT, Right,"
+ ];
+
+ windowrule = [
+ # Just dash of opacity by default
+ "opacity 0.97 0.9, class:.*"
+
+ # Ignore maximize requests from apps. You'll probably like this.
+ "suppressevent maximize, class:.*"
+
+ # Fix some dragging issues with XWayland
+ "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0"
+ ];
+
+ plugin = {
+ hyprselect = {
+ "col.main" = "rgba(ffffff25)";
+ "col.border" = "rgba(ffffff88)";
+
+ fade_time_ms = 165.0;
+
+ border_size = 1.0;
+ };
+ hyprscrolling = {
+ fullscreen_on_one_column = true;
+ };
+
+ # hyprbars = {
+ # enabled = false;
+ # };
+ };
+ };
+ };
+
+ };
+}
+
diff --git a/modules/common/features/hyprland.nix b/modules/common/features/hyprland.nix
new file mode 100644
index 0000000..b963c57
--- /dev/null
+++ b/modules/common/features/hyprland.nix
@@ -0,0 +1,41 @@
+{ self, inputs, ... }: {
+ flake.nixosModules.commonFeatureHyprland = { pkgs, ... }: {
+ programs.hyprland = {
+ enable = true;
+ withUWSM = true;
+ xwayland.enable = true;
+ };
+
+ services.greetd = {
+ enable = true;
+ settings = {
+ default_session = {
+ command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd 'uwsm start hyprland-uwsm.desktop'";
+ user = "greeter";
+ };
+ };
+ };
+
+ security.pam.services.hyprlock = {};
+
+ environment.systemPackages = with pkgs; [
+ hyprpaper
+ hypridle
+ hyprpicker
+ hyprsunset
+ hyprshot
+ waybar
+ walker
+ swayosd
+
+ playerctl
+ brightnessctl
+ wl-clipboard
+ wdisplays
+
+ bluetui
+
+ kdePackages.dolphin
+ ];
+ };
+}
diff --git a/modules/common/features/hyprland/hypridle.nix b/modules/common/features/hyprland/hypridle.nix
new file mode 100644
index 0000000..94d8b0e
--- /dev/null
+++ b/modules/common/features/hyprland/hypridle.nix
@@ -0,0 +1,29 @@
+{ ... }: {
+ flake.homeModules.commonFeatureHypridle = { pkgs, ... }: {
+ services.hypridle = {
+ enable = true;
+
+ settings = {
+ general = {
+ lock_cmd = "${pkgs.hyprlock}/bin/hyprlock";
+ before_sleep_cmd = "${pkgs.systemd}/bin/loginctl lock-session"; # lock before suspend.
+ after_sleep_cmd = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
+ inhibit_sleep = 3; # wait until screen is locked
+ };
+
+ listener = [
+ {
+ timeout = 60 * 5; # 5min
+ on-timeout = "${pkgs.systemd}/bin/loginctl lock-session"; # lock screen when timeout has passed
+ }
+ {
+ timeout = 60 * 5.5; # 5.5min
+ on-timeout = "${pkgs.hyprland}/bin/hyprctl dispatch dpms off"; # screen off when timeout has passed
+ on-resume = "${pkgs.hyprland}/bin/hyprctl dispatch dpms on && brightnessctl -r"; # screen on when activity is detected
+ }
+ ];
+ };
+ };
+ };
+}
+
diff --git a/modules/common/features/hyprland/hyprlock.nix b/modules/common/features/hyprland/hyprlock.nix
new file mode 100644
index 0000000..0b7b122
--- /dev/null
+++ b/modules/common/features/hyprland/hyprlock.nix
@@ -0,0 +1,59 @@
+{ ... }: {
+ flake.homeModules.commonFeatureHyprlock = { ... }: {
+ programs.hyprlock = {
+ enable = true;
+
+ settings = {
+ "$color" = "rgba(26,27,38,1.0)";
+ "$inner_color" = "rgba(26,27,38,0.8)";
+ "$outer_color" = "rgba(205,214,244,1.0)";
+ "$font_color" = "rgba(205,214,244,1.0)";
+ "$check_color" = "rgba(68, 157, 171, 1.0)";
+
+ general = {
+ ignore_empty_input = true;
+ };
+
+ background = {
+ monitor = "";
+ color = "$color";
+ # path = "~/Downloads/wallpaper.png";
+ blur_passes = 3;
+ };
+
+ animations = {
+ enabled = true;
+ };
+
+ input-field = {
+ monitor = "";
+ size = "650, 100";
+ position = "0, 0";
+ halign = "center";
+ valign = "center";
+
+ inner_color = "$inner_color";
+ outer_color = "$outer_color";
+ outline_thickness = 4;
+
+ font_family = "JetBrainsMono Nerd Font";
+ font_color = "$font_color";
+
+ placeholder_text = "Enter Password";
+ check_color = "$check_color";
+ fail_text = "$FAIL ($ATTEMPTS)";
+
+ rounding = 0;
+ shadow_passes = 0;
+ fade_on_empty = false;
+ };
+
+ auth = {
+ "fingerprint:enabled" = true;
+ };
+
+ };
+
+ };
+ };
+}
diff --git a/modules/common/features/hyprland/notifications.nix b/modules/common/features/hyprland/notifications.nix
new file mode 100644
index 0000000..c9f0564
--- /dev/null
+++ b/modules/common/features/hyprland/notifications.nix
@@ -0,0 +1,33 @@
+{ ... }: {
+ flake.homeModules.commonFeatureNotifications = { ... }: {
+ services.swaync = {
+ enable = true;
+
+ settings = {
+ notification-window-width = 350;
+ };
+
+ # Taken from:
+ # https://github.com/ErikReider/SwayNotificationCenter/blob/2083415ee6441acc272f46f8a43ebccae215f69a/data/style/style.scss#L4
+ style = ''
+ :root {
+ --cc-bg: rgba(46, 46, 46, 0.7);
+
+ --noti-border-color: rgba(255, 255, 255, 0.15);
+ --noti-bg: 48, 48, 48;
+ --noti-bg-alpha: 1;
+
+ --border-radius: 0;
+
+ --font-size-body: 13px;
+ --font-size-summary: 14px;
+ }
+
+ .close-button {
+ min-width: 18px;
+ min-height: 18px;
+ }
+ '';
+ };
+ };
+}
diff --git a/modules/common/features/hyprland/osd.nix b/modules/common/features/hyprland/osd.nix
new file mode 100644
index 0000000..5ce36e1
--- /dev/null
+++ b/modules/common/features/hyprland/osd.nix
@@ -0,0 +1,9 @@
+{ ... }: {
+ flake.homeModules.commonFeatureOsd = { ... }: {
+ services.swayosd = {
+ enable = true;
+ };
+
+ home.file.".config/swayosd/style.css".source = ./swayosd/style.css;
+ };
+}
diff --git a/home/common/optional/desktop/hyprland/swayosd/style.css b/modules/common/features/hyprland/swayosd/style.css
similarity index 100%
rename from home/common/optional/desktop/hyprland/swayosd/style.css
rename to modules/common/features/hyprland/swayosd/style.css
diff --git a/modules/common/features/hyprland/walker.nix b/modules/common/features/hyprland/walker.nix
new file mode 100644
index 0000000..bfd769f
--- /dev/null
+++ b/modules/common/features/hyprland/walker.nix
@@ -0,0 +1,5 @@
+{ ... }: {
+ flake.homeModules.commonFeatureWalker = { ... }: {
+ home.file.".config/walker/config.toml".source = ./walker/config.toml;
+ };
+}
diff --git a/home/common/optional/desktop/hyprland/walker/config.toml b/modules/common/features/hyprland/walker/config.toml
similarity index 100%
rename from home/common/optional/desktop/hyprland/walker/config.toml
rename to modules/common/features/hyprland/walker/config.toml
diff --git a/modules/common/features/hyprland/wallpaper.nix b/modules/common/features/hyprland/wallpaper.nix
new file mode 100644
index 0000000..7b8db35
--- /dev/null
+++ b/modules/common/features/hyprland/wallpaper.nix
@@ -0,0 +1,21 @@
+{ self, ... }: {
+ flake.homeModules.commonFeatureWallpaper = { ... }:
+ let
+ wallpaper = builtins.toString "${self}/assets/wallpaper2.jpg";
+ in {
+ services.hyprpaper = {
+ enable = true;
+ settings = {
+ spash = false;
+
+ preload = [ wallpaper ];
+
+ wallpaper = [
+ "eDP-1,${wallpaper}"
+ "HDMI-A-1,${wallpaper}"
+ ];
+ };
+ };
+ };
+}
+
diff --git a/modules/common/features/hyprland/waybar.nix b/modules/common/features/hyprland/waybar.nix
new file mode 100644
index 0000000..19cf633
--- /dev/null
+++ b/modules/common/features/hyprland/waybar.nix
@@ -0,0 +1,6 @@
+{ ... }: {
+ flake.homeModules.commonFeatureWaybar = { ... }: {
+ home.file.".config/waybar/config.jsonc".source = ./waybar/config.jsonc;
+ home.file.".config/waybar/style.css".source = ./waybar/style.css;
+ };
+}
diff --git a/home/common/optional/desktop/hyprland/waybar/config.jsonc b/modules/common/features/hyprland/waybar/config.jsonc
similarity index 100%
rename from home/common/optional/desktop/hyprland/waybar/config.jsonc
rename to modules/common/features/hyprland/waybar/config.jsonc
diff --git a/home/common/optional/desktop/hyprland/waybar/style.css b/modules/common/features/hyprland/waybar/style.css
similarity index 100%
rename from home/common/optional/desktop/hyprland/waybar/style.css
rename to modules/common/features/hyprland/waybar/style.css
diff --git a/modules/common/features/image-viewer.nix b/modules/common/features/image-viewer.nix
new file mode 100644
index 0000000..16cf1f7
--- /dev/null
+++ b/modules/common/features/image-viewer.nix
@@ -0,0 +1,27 @@
+{ ... }: {
+ flake.homeModules.commonFeatureImageViewer = { pkgs, ... }: {
+ xdg.desktopEntries.imv = {
+ name = "imv";
+ exec = "${pkgs.imv}/bin/imv %F";
+ icon = "imv";
+ };
+
+ xdg.mimeApps = let
+ value = "imv.desktop";
+
+ associations = builtins.listToAttrs (map (name: {
+ inherit name value;
+ }) [
+ "image/png"
+ "image/jpeg"
+ "image/gif"
+ "image/bmp"
+ "image/webp"
+ ]);
+ in {
+ enable = true;
+ associations.added = associations;
+ defaultApplications = associations;
+ };
+ };
+}
diff --git a/modules/common/features/locale.nix b/modules/common/features/locale.nix
new file mode 100644
index 0000000..54ddb1e
--- /dev/null
+++ b/modules/common/features/locale.nix
@@ -0,0 +1,16 @@
+{ ... }: {
+ flake.nixosModules.commonFeatureLocale = { pkgs, ... }: {
+ i18n.defaultLocale = "en_US.UTF-8";
+ i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" "zh_CN.UTF-8/UTF-8" ];
+ i18n.inputMethod = {
+ enable = true;
+ type = "fcitx5";
+ fcitx5.addons = with pkgs; [
+ # fcitx5-gtk # alternatively, kdePackages.fcitx5-qt
+ kdePackages.fcitx5-qt # alternatively, kdePackages.fcitx5-qt
+ qt6Packages.fcitx5-chinese-addons # table input method support
+ fcitx5-nord # a color theme
+ ];
+ };
+ };
+}
diff --git a/modules/common/features/music.nix b/modules/common/features/music.nix
new file mode 100644
index 0000000..f17f810
--- /dev/null
+++ b/modules/common/features/music.nix
@@ -0,0 +1,47 @@
+{ ... }: {
+ flake.homeModules.commonFeatureMusic = { pkgs, ... }: {
+ home.packages = with pkgs; [
+ mpc
+ ];
+
+ services.mpd = {
+ enable = true;
+ musicDirectory = "/home/max/media/music";
+
+ # extraConfig = ''
+ # audio_output {
+ # type "pipewire"
+ # name "pipewire"
+ # }
+ # '';
+
+
+ extraConfig = ''
+ audio_output {
+ type "alsa"
+ name "My ALSA"
+ mixer_type "hardware"
+ mixer_device "default"
+ mixer_control "PCM"
+ }
+ '';
+
+ };
+
+ services.mpd-mpris.enable = true;
+
+ 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 = "J"; command = [ "select_item" "scroll_down" ]; }
+ { key = "K"; command = [ "select_item" "scroll_up" ]; }
+ ];
+ };
+ };
+}
+
diff --git a/modules/common/features/pkgs-unstable.nix b/modules/common/features/pkgs-unstable.nix
new file mode 100644
index 0000000..9edbaaa
--- /dev/null
+++ b/modules/common/features/pkgs-unstable.nix
@@ -0,0 +1,11 @@
+{ inputs, ... }: {
+ flake.nixosModules.commonUnstablePkgsOverlay = { ... }: {
+ nixpkgs.overlays = [
+ (final: prev: {
+ pkgs-unstable = import inputs.nixpkgs-unstable {
+ inherit (prev.stdenv.hostPlatform) system;
+ };
+ })
+ ];
+ };
+}
diff --git a/modules/common/features/yubikey.nix b/modules/common/features/yubikey.nix
new file mode 100644
index 0000000..fce2a70
--- /dev/null
+++ b/modules/common/features/yubikey.nix
@@ -0,0 +1,32 @@
+{ ... }: {
+ flake.nixosModules.commonFeatureYubikey = { pkgs, ... }: {
+ environment.systemPackages = with pkgs; [
+ yubioath-flutter # gui
+ yubikey-manager # `ykman`
+ pam_u2f # yubikey with sudo
+ ];
+
+ services.pcscd.enable = true;
+ services.udev.packages = [ pkgs.yubikey-personalization ];
+
+ services.yubikey-agent.enable = true;
+
+ security.pam = {
+ sshAgentAuth.enable = true;
+ u2f = {
+ enable = true;
+ settings = {
+ cue = true;
+ authFile = "/home/max/.config/Yubico/u2f_keys";
+ };
+ };
+ services = {
+ login.u2fAuth = true;
+ sudo = {
+ u2fAuth = true;
+ sshAgentAuth = true;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/common/features/zathura.nix b/modules/common/features/zathura.nix
new file mode 100644
index 0000000..003a65e
--- /dev/null
+++ b/modules/common/features/zathura.nix
@@ -0,0 +1,10 @@
+{ ... }: {
+ flake.homeModules.commonFeatureZathura = { ... }: {
+ programs.zathura = {
+ enable = true;
+ options = {
+ selection-clipboard = "clipboard";
+ };
+ };
+ };
+}
diff --git a/modules/koon/feature/tailscale.nix b/modules/koon/feature/tailscale.nix
new file mode 100644
index 0000000..acff64f
--- /dev/null
+++ b/modules/koon/feature/tailscale.nix
@@ -0,0 +1,17 @@
+{ ... }: {
+ flake.nixosModules.koonFeatureTailscale = { pkgs, ... }: {
+ services.tailscale.enable = true;
+
+ systemd.services.tailscale-restart = {
+ description = "Restart Tailscale after waking up";
+ after = [ "suspend.target" ];
+ wantedBy = [ "suspend.target" ];
+
+ serviceConfig = {
+ Type = "simple";
+ ExecStart = "${pkgs.systemd}/bin/systemctl restart tailscaled.service";
+ };
+ };
+ };
+}
+
diff --git a/host/max/hardware-configuration.nix b/modules/koon/host/max/_hardware-configuration.nix
similarity index 100%
rename from host/max/hardware-configuration.nix
rename to modules/koon/host/max/_hardware-configuration.nix
diff --git a/modules/koon/host/max/browser.nix b/modules/koon/host/max/browser.nix
new file mode 100644
index 0000000..56c6d6f
--- /dev/null
+++ b/modules/koon/host/max/browser.nix
@@ -0,0 +1,184 @@
+{ self, ... }: {
+ flake.homeModules.koonMaxBrowser = { pkgs, ... }: {
+ imports = [
+ self.inputs.zen-browser.homeModules.beta
+ ];
+
+ xdg.mimeApps = let
+ value = let
+ browser = self.inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.beta; # or twilight
+ in
+ browser.meta.desktopFileName;
+
+ associations = builtins.listToAttrs (map (name: {
+ inherit name value;
+ }) [
+ "application/x-extension-shtml"
+ "application/x-extension-xhtml"
+ "application/x-extension-html"
+ "application/x-extension-xht"
+ "application/x-extension-htm"
+ "x-scheme-handler/unknown"
+ "x-scheme-handler/mailto"
+ "x-scheme-handler/chrome"
+ "x-scheme-handler/about"
+ "x-scheme-handler/https"
+ "x-scheme-handler/http"
+ "application/xhtml+xml"
+ "application/json"
+ "text/plain"
+ "text/html"
+ ]);
+ in {
+ enable = true;
+ associations.added = associations;
+ defaultApplications = associations;
+ };
+
+ programs.zen-browser = {
+ enable = true;
+
+ policies = {
+ AutofillAddressEnabled = false;
+ AutofillCreditCardEnabled = false;
+ DisableAppUpdate = true;
+ DisableFeedbackCommands = true;
+ DisableFirefoxStudies = true;
+ DisablePocket = true;
+ DisableTelemetry = true;
+ DontCheckDefaultBrowser = true;
+ NoDefaultBookmarks = true;
+ OfferToSaveLogins = false;
+ EnableTrackingProtection = {
+ Value = true;
+ Locked = true;
+ Cryptomining = true;
+ Fingerprinting = true;
+ };
+
+ Preferences = {
+ "privacy.resistFingerprinting" = {
+ Value = true;
+ Status = "locked";
+ };
+ "privacy.resistFingerprinting.randomization.canvas.use_siphash" = {
+ Value = true;
+ Status = "locked";
+ };
+ "privacy.resistFingerprinting.randomization.daily_reset.enabled" = {
+ Value = true;
+ Status = "locked";
+ };
+ "privacy.resistFingerprinting.randomization.daily_reset.private.enabled" = {
+ Value = true;
+ Status = "locked";
+ };
+ "privacy.resistFingerprinting.block_mozAddonManager" = {
+ Value = true;
+ Status = "locked";
+ };
+ };
+
+
+ # ID's can be collected from this command:
+ # nix run github:tupakkatapa/mozid -- "https://addons.mozilla.org/en-US/firefox/addon//"
+ ExtensionSettings = {
+ # The default behaviour of ctrl+click, shift+click, cmd+click (on macOS) and middle-click when clicking on links is to open the link in a new tab (or new window in the case of shift).
+ # This behaviour is sometimes broken by silly developers.
+ "{18b670e2-67df-4b26-b9b0-34835d1f062a}" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/link-fixer/latest.xpi";
+ installation_mode = "force_installed";
+ };
+ };
+ };
+
+ profiles.default = let
+ containers = {
+ Personal = {
+ color = "yellow";
+ icon = "circle";
+ id = 1;
+ };
+ School = {
+ color = "red";
+ icon = "fruit";
+ id = 2;
+ };
+ Work = {
+ color = "blue";
+ icon = "briefcase";
+ id = 3;
+ };
+ };
+ spaces = {
+ Personal = {
+ id = "c6de089c-410d-4206-961d-ab11f988d40a";
+ icon = "⭐";
+ container = containers."Personal".id;
+ position = 1000;
+ };
+ School = {
+ id = "78aabdad-8aae-4fe0-8ff0-2a0c6c4ccc24";
+ icon = "🍎";
+ container = containers."School".id;
+ position = 2000;
+ };
+ Work = {
+ id = "cdd10fab-4fc5-494b-9041-325e5759195b";
+ icon = "💼";
+ container = containers."Work".id;
+ position = 3000;
+ };
+ };
+ pins = {
+ # Personal Pins
+ "Proton Mail" = {
+ id = "d9942e0a-0997-418d-b357-91727300d184";
+ container = containers.Personal.id;
+ url = "https://mail.proton.me";
+ isEssential = true;
+ position = 1;
+ };
+ "Proton Calendar" = {
+ id = "6557e03f-c0ab-4656-ac94-acfb1fe19f3c";
+ container = containers.Personal.id;
+ url = "https://calendar.proton.me";
+ isEssential = true;
+ position = 2;
+ };
+ "YNAB" = {
+ id = "10cb5609-fcd5-4ed6-a48d-24eb22f2d624";
+ container = containers.Personal.id;
+ url = "https://app.ynab.com";
+ isEssential = true;
+ position = 3;
+ };
+
+ # # School Pins
+ # "Canvas" = {
+ # id = "cfbdc143-6a16-46d7-b33e-e9c964725e59";
+ # workspace = spaces.School.id;
+ # container = containers.School.id;
+ # url = "https://clemson.instructure.com/calendar";
+ # isEssential = true;
+ # position = 104;
+ # };
+ };
+ in {
+ containersForce = true;
+ spacesForce = true;
+ pinsForce = true;
+ inherit containers spaces pins;
+
+ # This is awesome :)
+ # https://nur.nix-community.org/repos/rycee/
+ extensions.packages = with self.inputs.firefox-addons.packages.${pkgs.stdenv.hostPlatform.system}; [
+ ublock-origin
+ proton-pass
+ istilldontcareaboutcookies
+ darkreader
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/koon/host/max/configuration.nix b/modules/koon/host/max/configuration.nix
new file mode 100644
index 0000000..6824d5a
--- /dev/null
+++ b/modules/koon/host/max/configuration.nix
@@ -0,0 +1,152 @@
+{ self, ... }: {
+ flake.nixosModules.koonMaxConfiguration = { pkgs, lib, modulesPath, ... }: {
+ imports = [
+ ./_hardware-configuration.nix
+
+ self.nixosModules.commonUnstablePkgsOverlay
+
+ self.nixosModules.commonFeatureEmail
+ self.nixosModules.commonFeatureFont
+ self.nixosModules.commonFeatureLocale
+ self.nixosModules.commonFeatureYubikey
+
+ self.nixosModules.commonFeatureHyprland
+
+ self.nixosModules.koonFeatureTailscale
+
+ self.nixosModules.koonMaxSops
+ self.nixosModules.koonMaxUser
+ self.nixosModules.koonMaxHomeManager
+ ];
+
+ # Use the systemd-boot EFI boot loader.
+ boot.loader.systemd-boot.enable = true;
+ boot.loader.efi.canTouchEfiVariables = false;
+
+ boot.m1n1CustomLogo = ../../../../assets/logo.png;
+
+ hardware = {
+ asahi = {
+ peripheralFirmwareDirectory = ./firmware;
+ setupAsahiSound = true;
+ };
+
+ graphics = {
+ enable = true;
+ extraPackages = with pkgs; [
+ mesa.opencl
+ ];
+ };
+ };
+
+ services.upower.enable = true;
+ services.logind.settings.Login.HandlePowerKey = "ignore";
+
+ networking.networkmanager = {
+ enable = true;
+ plugins = with pkgs; [
+ networkmanager-openconnect
+ ];
+ };
+
+ hardware.bluetooth = {
+ enable = true;
+ powerOnBoot = true;
+ };
+
+ environment.variables = {
+ XDG_DATA_HOME = "/home/max/.local/share";
+ GSK_RENDERER = "ngl";
+ EDITOR = "nvim";
+ };
+ environment.sessionVariables.NIXOS_OZONE_WL = "1";
+
+ programs.kdeconnect.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ networkmanager
+
+ vim
+ git
+ wget
+ file
+ just
+
+ libreoffice-qt
+
+ pkgs-unstable.signal-desktop
+ pkgs-unstable.gurk-rs
+
+ gnupg
+
+ (pass.withExtensions (exts: [ exts.pass-otp ]))
+
+ pinentry-curses
+ pinentry-qt
+
+ fzf
+ zip
+ jq
+ ffmpeg
+ ripgrep
+ unzip
+ zbar
+ tt
+ sc-im
+ libqalculate
+ librespeed-cli
+
+ gparted
+
+ tea
+
+ cloudflared
+ # gcc
+
+ prismlauncher
+
+ gimp
+ inkscape
+
+ # arm support
+ pkgs-unstable.sparrow
+
+
+ (writeShellScriptBin "radio" ''
+ list="
+ WIOP http://s4.yesstreaming.net:7119/;audio.mp3
+ FamilyAlter https://usa17.fastcast4u.com/proxy/roloffev?mp=/1
+ "
+
+ choice=$(echo "$list" | awk '{print $1}' | ${fzf}/bin/fzf)
+
+ if [[ -n "$choice" ]]; then
+ url=$(echo "$list" | awk -v name="$choice" '$1==name {print $2}')
+ ${mpg123}/bin/mpg123 "$url"
+ fi
+ '')
+
+ (pkgs.writeShellScriptBin "battery-graph" ''
+ ${pkgs.coreutils}/bin/tail -n 20 /var/lib/upower/history-charge-bq40z651-69-F8Y3262H468Q1LTA1.dat | ${pkgs.coreutils}/bin/cut -f1,2 | RUBYOPT='-W0' ${pkgs.youplot}/bin/uplot line -w 70
+ '')
+
+ (pkgs.writeShellScriptBin "ocr-clip" ''
+ ${pkgs.grimblast}/bin/grimblast -f save area - | ${pkgs.tesseract}/bin/tesseract stdin stdout | ${pkgs.wl-clipboard}/bin/wl-copy
+ '')
+ ];
+
+ programs.zsh.enable = true;
+
+ programs.gnupg.agent = {
+ enable = true;
+ pinentryPackage = pkgs.pinentry-qt;
+ enableSSHSupport = true;
+ };
+
+
+ time.timeZone = "America/New_York";
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+
+ system.stateVersion = "25.05";
+ };
+}
diff --git a/modules/koon/host/max/default.nix b/modules/koon/host/max/default.nix
new file mode 100644
index 0000000..c1e0bc2
--- /dev/null
+++ b/modules/koon/host/max/default.nix
@@ -0,0 +1,11 @@
+{ self, inputs, ... }: {
+ flake.nixosConfigurations.koonMax = inputs.nixpkgs.lib.nixosSystem {
+ modules = [
+ self.inputs.nixos-apple-silicon.nixosModules.apple-silicon-support
+ self.inputs.sops-nix.nixosModules.sops
+ self.inputs.home-manager.nixosModules.home-manager
+ self.nixosModules.koonMaxConfiguration
+ ];
+ };
+}
+
diff --git a/modules/koon/host/max/development/git.nix b/modules/koon/host/max/development/git.nix
new file mode 100644
index 0000000..fe7c251
--- /dev/null
+++ b/modules/koon/host/max/development/git.nix
@@ -0,0 +1,33 @@
+{ ... }: {
+ flake.homeModules.koonMaxGit = { lib, ... }:
+ let
+ publicGitEmail = "22125083+k2on@users.noreply.github.com";
+ publicKey = "/home/max/.ssh/id_maxkey.pub";
+ in {
+ programs.git = {
+ enable = true;
+ settings = {
+ init.defaultBranch = "main";
+ push.autoSetupRemote = true;
+
+ commit.gpgsign = true;
+ gpg.format = "ssh";
+
+ user.name = "Max Koon";
+ user.email = publicGitEmail;
+ user.signing.key = publicKey;
+ gpg.ssh.allowedSignersFile = "/home/max/.ssh/allowed_signers";
+ };
+
+ signing = {
+ signByDefault = true;
+ key = publicKey;
+ };
+ };
+
+ home.file.".ssh/allowed_signers".text = ''
+ ${publicGitEmail} ${lib.fileContents ./id_maxkey.pub}
+ '';
+ };
+}
+
diff --git a/host/max/keys/id_maxkey.pub b/modules/koon/host/max/development/id_maxkey.pub
similarity index 100%
rename from host/max/keys/id_maxkey.pub
rename to modules/koon/host/max/development/id_maxkey.pub
diff --git a/modules/koon/host/max/development/neovim.nix b/modules/koon/host/max/development/neovim.nix
new file mode 100644
index 0000000..589a67f
--- /dev/null
+++ b/modules/koon/host/max/development/neovim.nix
@@ -0,0 +1,288 @@
+{ self, ... }: {
+ flake.homeModules.koonMaxNeovim = { pkgs, ... }: {
+ imports = [
+ self.inputs.nixvim.homeModules.nixvim
+ ];
+
+ programs.nixvim = {
+ enable = true;
+
+ colorschemes.tokyonight.enable = true;
+
+ globals = {
+ mapleader = " ";
+ maplocalleader = " ";
+ };
+
+ clipboard = {
+ providers.wl-copy.enable = true;
+ register = "unnamedplus";
+ };
+
+ opts = {
+ background = "dark";
+ relativenumber = true;
+ cursorline = true;
+ number = true;
+
+ tabstop = 2;
+ expandtab = true;
+
+ signcolumn = "yes";
+
+ updatetime = 250;
+
+ list = true;
+ listchars.__raw = "{ tab = '» ', trail = '·', nbsp = '␣' }";
+
+ };
+
+ extraConfigLua = ''
+ vim.g.transparent_enabled = true
+ require('transparent').setup({ exclude_groups = { "CursorLine" } })
+ require('stay-centered').setup({ enable = true })
+ require('mini.ai').setup()
+ '';
+
+ keymaps = [
+ {
+ mode = "n";
+ key = "";
+ action = "nohlsearch";
+ }
+ {
+ mode = "n";
+ key = "a";
+ action.__raw = "function() require'harpoon':list():add() end";
+ }
+ {
+ mode = "n";
+ key = "";
+ action.__raw =
+ "function() require'harpoon'.ui:toggle_quick_menu(require'harpoon':list()) end";
+ }
+ {
+ mode = "n";
+ key = "";
+ action.__raw = "function() require'harpoon':list():select(1) end";
+ }
+ {
+ mode = "n";
+ key = "";
+ action.__raw = "function() require'harpoon':list():select(2) end";
+ }
+ {
+ mode = "n";
+ key = "";
+ action.__raw = "function() require'harpoon':list():select(3) end";
+ }
+ {
+ mode = "n";
+ key = "";
+ action.__raw = "function() require'harpoon':list():select(4) end";
+ }
+
+ {
+ mode = "n";
+ key = "b";
+ action = "Neotree";
+ }
+ {
+ mode = "n";
+ key = "l";
+ action = "Neotree reveal";
+ }
+ ];
+
+ autoCmd = [
+ {
+ event = [ "BufWritePre" ];
+ pattern = "*";
+ command = "lua vim.lsp.buf.format()";
+ }
+ ];
+
+ diagnostic.settings.virtual_text = true;
+
+ userCommands.W.command = "w";
+
+ plugins = {
+
+ web-devicons.enable = true;
+ sleuth.enable = true;
+ lastplace.enable = true;
+
+ gitsigns.enable = true;
+ highlight-colors.enable = true;
+ todo-comments.enable = true;
+ goyo.enable = true;
+
+ treesitter = {
+ enable = true;
+ settings = {
+ ensureInstalled =
+ [ "typescript" "rust" "php" "blade" "python" "nix" ];
+
+ highlight = { enable = true; };
+
+ indent = { enable = true; };
+ };
+ };
+
+ lsp = {
+ enable = true;
+
+ servers = {
+ tsgo.enable = true;
+ tailwindcss.enable = false;
+ biome.enable = false;
+ rust_analyzer = {
+ enable = true;
+ installCargo = true;
+ installRustc = true;
+ };
+ clangd.enable = true;
+ phpactor.enable = true;
+ pylsp.enable = true;
+ pyright.enable = true;
+ nixd.enable = true;
+ };
+
+ keymaps = {
+ extra = [
+ {
+ mode = "n";
+ key = "gd";
+ action.__raw = "require('telescope.builtin').lsp_definitions";
+ options = { desc = "LSP: [G]oto [D]efinition"; };
+ }
+ {
+ mode = "n";
+ key = "gr";
+ action.__raw = "require('telescope.builtin').lsp_references";
+ options = { desc = "LSP: [G]oto [R]eferences"; };
+ }
+ ];
+
+ lspBuf = {
+ "." = {
+ mode = [ "n" "x" ];
+ action = "code_action";
+ desc = "Code action";
+ };
+ };
+ };
+ };
+
+ lazydev.enable = true;
+ luasnip.enable = true;
+
+ telescope = {
+ enable = true;
+
+ extensions = {
+ fzf-native.enable = true;
+ ui-select.enable = true;
+ };
+
+ keymaps = {
+ "sf" = {
+ mode = "n";
+ action = "find_files";
+ options = { desc = "[S]earch [F]iles"; };
+ };
+ "sk" = {
+ mode = "n";
+ action = "live_grep";
+ options = { desc = "[S]earch [S]tring"; };
+ };
+ };
+ settings = {
+ extensions.__raw =
+ "{ ['ui-select'] = { require('telescope.themes').get_dropdown() } }";
+ };
+ };
+
+ cmp = {
+ enable = true;
+ settings = {
+ snippet = {
+ expand = ''
+ function(args)
+ require('luasnip').lsp_expand(args.body)
+ end
+ '';
+ };
+
+ completion = { completeopt = "menu,menuone,noinsert"; };
+ formatting = {
+ format = ''require("nvim-highlight-colors").format'';
+ };
+ mapping = {
+ "" = "cmp.mapping.confirm { select = true }";
+ "" = "cmp.mapping.select_next_item()";
+ "" = "cmp.mapping.select_prev_item()";
+ "" = "cmp.mapping.select_next_item()";
+ "" = "cmp.mapping.select_prev_item()";
+ "" = "cmp.mapping.select_next_item()";
+ "" = "cmp.mapping.select_prev_item()";
+ };
+ sources = [
+ {
+ name = "lazydev";
+
+ group_index = 0;
+ }
+ { name = "nvim_lsp"; }
+ { name = "luasnip"; }
+ { name = "path"; }
+ { name = "nvim_lsp_signature_help"; }
+ ];
+ };
+ };
+
+ harpoon = {
+ enable = true;
+ settings.settings = { save_on_toggle = true; };
+ };
+ neo-tree = {
+ enable = true;
+ settings = {
+ window.width = 25;
+ filesystem = {
+ filtered_items = {
+ visible = true;
+ };
+ };
+ };
+ };
+ wakatime.enable = true;
+ autoclose.enable = true;
+ ts-autotag.enable = true;
+ bullets.enable = true;
+ spider = {
+ enable = true;
+ settings = {
+ subwordMovement = true;
+ skipInsignificantPunctuation = false;
+ };
+ keymaps = {
+ motions = {
+ "w" = "w";
+ "e" = "e";
+ "b" = "b";
+ };
+ };
+ };
+
+ transparent.enable = true;
+ };
+
+ extraPlugins = with pkgs.vimPlugins; [
+ stay-centered-nvim
+ mini-ai
+ ];
+
+ };
+ };
+}
diff --git a/modules/koon/host/max/development/ssh.nix b/modules/koon/host/max/development/ssh.nix
new file mode 100644
index 0000000..8bfac80
--- /dev/null
+++ b/modules/koon/host/max/development/ssh.nix
@@ -0,0 +1,38 @@
+{ ... }: {
+ flake.homeModules.koonMaxSsh = { pkgs, ... }: {
+ programs.ssh = {
+ enable = true;
+ enableDefaultConfig = false;
+
+ matchBlocks = {
+ "*" = {
+ addKeysToAgent = "yes";
+ };
+ "m1" = {
+ host = "m1";
+ user = "admin";
+ };
+ "ark" = {
+ host = "ark";
+ user = "admin";
+ };
+ "ssh.koon.us" = {
+ host = "ssh.koon.us";
+ user = "git";
+ proxyCommand = "${pkgs.cloudflared}/bin/cloudflared access ssh --hostname %h";
+ };
+ "git" = {
+ host = "github.com";
+ user = "git";
+ identityFile = [
+ "~/.ssh/id_maxkey"
+ ];
+ };
+ };
+ };
+
+ home.file = {
+ ".ssh/id_maxkey.pub".source = ./id_maxkey.pub;
+ };
+ };
+}
diff --git a/host/max/firmware/all_firmware.tar.gz b/modules/koon/host/max/firmware/all_firmware.tar.gz
similarity index 100%
rename from host/max/firmware/all_firmware.tar.gz
rename to modules/koon/host/max/firmware/all_firmware.tar.gz
diff --git a/host/max/firmware/kernelcache.release.mac14j b/modules/koon/host/max/firmware/kernelcache.release.mac14j
similarity index 100%
rename from host/max/firmware/kernelcache.release.mac14j
rename to modules/koon/host/max/firmware/kernelcache.release.mac14j
diff --git a/modules/koon/host/max/home.nix b/modules/koon/host/max/home.nix
new file mode 100644
index 0000000..d1a9ca5
--- /dev/null
+++ b/modules/koon/host/max/home.nix
@@ -0,0 +1,54 @@
+{ self, inputs, ... }: {
+ flake.nixosModules.koonMaxHomeManager = { ... }: {
+ imports = [
+ inputs.home-manager.nixosModules.home-manager
+ ];
+
+ home-manager = {
+ useGlobalPkgs = true;
+ useUserPackages = true;
+ extraSpecialArgs = { inherit inputs self; };
+
+ users.max = {
+ imports = [ self.homeModules.koonMaxHome ];
+ };
+ };
+ };
+
+ flake.homeModules.koonMaxHome = { ... }: {
+ imports = [
+ self.homeModules.commonFeatureHyprlandConfig
+ self.homeModules.commonFeatureHypridle
+ self.homeModules.commonFeatureHyprlock
+ self.homeModules.commonFeatureNotifications
+ self.homeModules.commonFeatureOsd
+ self.homeModules.commonFeatureWalker
+ self.homeModules.commonFeatureWallpaper
+ self.homeModules.commonFeatureWaybar
+
+ self.homeModules.commonFeatureZathura
+ self.homeModules.commonFeatureAlacritty
+ self.homeModules.commonFeatureLf
+ self.homeModules.commonFeatureTmux
+ self.homeModules.commonFeatureStarship
+ self.homeModules.commonFeatureDirenv
+ self.homeModules.commonFeatureImageViewer
+ self.homeModules.commonFeatureMusic
+ self.homeModules.commonFeatureZsh
+
+ self.homeModules.koonMaxBrowser
+ self.homeModules.koonMaxNeovim
+ self.homeModules.koonMaxGit
+ self.homeModules.koonMaxSsh
+ ];
+
+ gtk = {
+ enable = true;
+ colorScheme = "dark";
+ };
+
+ home.username = "max";
+ home.homeDirectory = "/home/max";
+ home.stateVersion = "25.05";
+ };
+}
diff --git a/modules/koon/host/max/sops.nix b/modules/koon/host/max/sops.nix
new file mode 100644
index 0000000..8925ad0
--- /dev/null
+++ b/modules/koon/host/max/sops.nix
@@ -0,0 +1,34 @@
+{ self, ... }: {
+ flake.nixosModules.koonMaxSops = { config, ... }: {
+ sops = {
+ age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
+
+ defaultSopsFile = "${self}/secrets/koon/max/default.yaml";
+
+ validateSopsFiles = false;
+
+ secrets = {
+ "yubico/u2f_keys" = {
+ owner = config.users.users.max.name;
+ inherit (config.users.users.max) group;
+ path = "/home/max/.config/Yubico/u2f_keys";
+ };
+ "ssh_keys/max" = {
+ owner = config.users.users.max.name;
+ inherit (config.users.users.max) group;
+ path = "/home/max/.ssh/id_maxkey";
+ mode = "0600";
+ };
+ "waka_config" = {
+ owner = config.users.users.max.name;
+ inherit (config.users.users.max) group;
+ path = "/home/max/.wakatime.cfg";
+ };
+
+ "proton_key" = {};
+ };
+
+ };
+ environment.sessionVariables.PROTON_PASS_ENCRYPTION_KEY = config.sops.secrets.proton_key.path;
+ };
+}
diff --git a/modules/koon/host/max/user.nix b/modules/koon/host/max/user.nix
new file mode 100644
index 0000000..7ca92b9
--- /dev/null
+++ b/modules/koon/host/max/user.nix
@@ -0,0 +1,31 @@
+{ ... }: {
+ flake.nixosModules.koonMaxUser = { pkgs, config, ... }: {
+
+ sops.secrets.max-password.neededForUsers = true;
+
+ users.mutableUsers = true;
+
+ users.users.max = {
+ isNormalUser = true;
+ # hashedPasswordFile = config.sops.secrets.max-password.path;
+
+ password = "password";
+
+ extraGroups = [ "wheel" "networkmanager" "video" "kvm" "docker" "ydotool" ];
+ packages = with pkgs; [ tree ];
+ shell = pkgs.zsh;
+ };
+
+ programs.adb.enable = true;
+
+ virtualisation.docker = {
+ enable = true;
+
+ rootless = {
+ enable = true;
+ setSocketVariable = true;
+ };
+ };
+ };
+}
+
diff --git a/modules/parts.nix b/modules/parts.nix
new file mode 100644
index 0000000..b5f45c1
--- /dev/null
+++ b/modules/parts.nix
@@ -0,0 +1,15 @@
+{ inputs, ... }: {
+ imports = [
+ inputs.home-manager.flakeModules.home-manager
+ ];
+
+ config = {
+ systems = [
+ "x86_64-linux"
+ "x86_64-darwin"
+ "aarch64-linux"
+ "aarch64-darwin"
+ ];
+ };
+}
+
diff --git a/modules/shell.nix b/modules/shell.nix
new file mode 100644
index 0000000..331c530
--- /dev/null
+++ b/modules/shell.nix
@@ -0,0 +1,19 @@
+{ ... }: {
+ perSystem = { pkgs, ... }: {
+ devShells.default = pkgs.mkShell {
+ shellHook = ''
+ export SOPS_AGE_KEY="$(${pkgs.age-plugin-yubikey}/bin/age-plugin-yubikey --identity)"
+ '';
+
+ packages = with pkgs; [
+ age
+ ssh-to-age
+ sops
+ just
+ nix-inspect
+
+ age-plugin-yubikey
+ ];
+ };
+ };
+}
diff --git a/secrets b/secrets
index 78d7d95..c4f9e7b 160000
--- a/secrets
+++ b/secrets
@@ -1 +1 @@
-Subproject commit 78d7d95fd0990a2d840f3a06f2ddb1ee82ccf651
+Subproject commit c4f9e7bd9888dc3f3c078408e335004ffe8c5a92