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