From 7e4007c47edfce3f6b05a7c6d136a78264430265 Mon Sep 17 00:00:00 2001 From: atagen Date: Sun, 20 Jul 2025 23:35:43 +1000 Subject: [PATCH] refactor in style of synaptic standard --- .gitignore | 2 +- .gitmodules | 3 - TODO | 7 - {home/icons => assets}/fb_msg.png | Bin {home/icons => assets}/ms_teams.png | Bin {home/icons => assets}/ollama.png | Bin {home/icons => assets}/openwebui.png | Bin {home/icons => assets}/winlogo.png | Bin base/cli.nix | 25 ++ base/debloat.nix | 13 + {system/modules => base}/docs.nix | 0 {home/programs => base}/helix.nix | 2 +- base/network.nix | 4 + base/nix/gc.nix | 27 ++ base/nix/managers.nix | 19 + base/nix/meat.nix | 10 + base/nix/nixpkgs.nix | 9 + base/nix/settings.nix | 26 ++ {system => base/nix}/substituters.nix | 0 base/nix/tools.nix | 21 + base/systemd.nix | 6 + home/programs/kitty.nix => base/terminal.nix | 35 +- base/users.nix | 16 + create.nix | 53 --- desktop/audio-control.nix | 13 + desktop/binds.nix | 119 ++++++ .../bootloader.nix => desktop/boot.nix | 14 +- .../firefox.nix => desktop/browser.nix | 2 +- desktop/chat.nix | 18 + {home/modules => desktop}/dev.nix | 55 +-- desktop/documents.nix | 9 + desktop/fm.nix | 10 + desktop/gfx-env.nix | 14 + desktop/hw.nix | 5 + desktop/input.nix | 6 + desktop/integrations.nix | 38 ++ desktop/kernel.nix | 11 + desktop/logout.nix | 44 +++ {home/dots/wlogout => desktop/logout}/layout | 0 desktop/logout/style.css | 48 +++ .../media-players.nix => desktop/media.nix | 3 +- desktop/network.nix | 15 + .../password-manager.nix | 5 +- .../platform-themes.nix | 11 +- .../util/ez.nix => desktop/quick-services.nix | 30 +- desktop/rice.nix | 25 ++ desktop/shell.nix | 62 +++ {system/modules => desktop}/sound.nix | 0 desktop/udisks.nix | 17 + desktop/webapps.nix | 14 + .../webapps}/firefox-webapp.nix | 12 +- .../util => desktop/webapps}/local-webapp.nix | 8 +- desktop/wm.nix | 85 +++++ entry.nix | 38 +- flake.nix | 48 --- flakes/comfyui-plugins/essentials/default.nix | 28 -- flakes/comfyui-plugins/flake.lock | 75 ---- flakes/comfyui-plugins/flake.nix | 49 --- flakes/comfyui-plugins/gguf/default.nix | 23 -- flakes/comfyui-plugins/openpose/default.nix | 20 - .../openpose/openpose_no_update.patch | 12 - flakes/comfyui-plugins/tensorrt/default.nix | 24 -- flakes/comfyui/default.nix | 96 ----- flakes/comfyui/flake.lock | 41 -- flakes/comfyui/flake.nix | 56 --- flakes/comfyui/folder_paths.patch | 28 -- flakes/comfyui/module.nix | 49 --- flakes/comfyui/spandrel.nix | 45 --- flakes/niri-session-manager/flake.lock | 41 -- flakes/niri-session-manager/flake.nix | 66 ---- home/bolt.nix | 10 - home/dots/Xresources | 37 -- home/dots/wlogout/style.css | 48 --- home/dots/zsh | 44 --- home/home.nix | 100 ----- home/homepkgs/culr.nix | 33 -- home/icons/syncthing.png | Bin 87692 -> 0 bytes home/modules/chat.nix | 23 -- home/modules/cli.nix | 22 -- home/modules/creative.nix | 10 - home/modules/desktop.nix | 20 - home/modules/documents.nix | 6 - home/modules/niri.nix | 288 -------------- home/modules/webapps.nix | 20 - home/plank.nix | 13 - home/programs/wlogout.nix | 71 ---- home/util/name.nix | 10 - hosts/adrift/boot.nix | 25 ++ hosts/adrift/fs.nix | 18 + hosts/adrift/hw.nix | 5 + hosts/adrift/id.nix | 9 + hosts/adrift/power.nix | 6 + hosts/quiver/boot.nix | 40 ++ hosts/quiver/fs.nix | 30 ++ hosts/quiver/hw.nix | 37 ++ .../modules/sydney.nix => hosts/quiver/id.nix | 2 + hosts/quiver/input.nix | 13 + hosts/quiver/llm.nix | 20 + hosts/quiver/outputs.nix | 14 + hosts/quiver/stateversion.nix | 5 + rice/default.nix | 9 +- system/adrift.nix | 98 ----- system/configuration.nix | 99 ----- system/modules/anal-retentive.nix | 29 -- system/modules/culr.nix | 6 - system/modules/network.nix | 22 -- system/modules/nix-meta.nix | 63 --- system/modules/term.nix | 21 - system/modules/wm.nix | 28 -- system/quiver.nix | 207 ---------- system/servers/atagen-vps/reflector.nix | 361 ------------------ system/servers/rhizome-vps/configuration.nix | 295 -------------- system/servers/rhizome-vps/flake.nix | 53 --- .../rhizome-vps/hardware-configuration.nix | 38 -- system/servers/rhizome-vps/rhizome.nix | 127 ------ util/create.nix | 29 ++ util/get-modules.nix | 8 - inputs.nix => util/inputs.nix | 4 +- util/recursively-import.nix | 21 + 119 files changed, 1098 insertions(+), 3109 deletions(-) delete mode 100644 .gitmodules delete mode 100644 TODO rename {home/icons => assets}/fb_msg.png (100%) rename {home/icons => assets}/ms_teams.png (100%) rename {home/icons => assets}/ollama.png (100%) rename {home/icons => assets}/openwebui.png (100%) rename {home/icons => assets}/winlogo.png (100%) create mode 100644 base/cli.nix create mode 100644 base/debloat.nix rename {system/modules => base}/docs.nix (100%) rename {home/programs => base}/helix.nix (99%) create mode 100644 base/network.nix create mode 100644 base/nix/gc.nix create mode 100644 base/nix/managers.nix create mode 100644 base/nix/meat.nix create mode 100644 base/nix/nixpkgs.nix create mode 100644 base/nix/settings.nix rename {system => base/nix}/substituters.nix (100%) create mode 100644 base/nix/tools.nix create mode 100644 base/systemd.nix rename home/programs/kitty.nix => base/terminal.nix (60%) create mode 100644 base/users.nix delete mode 100644 create.nix create mode 100644 desktop/audio-control.nix create mode 100644 desktop/binds.nix rename system/modules/bootloader.nix => desktop/boot.nix (85%) rename home/programs/firefox.nix => desktop/browser.nix (99%) create mode 100644 desktop/chat.nix rename {home/modules => desktop}/dev.nix (61%) create mode 100644 desktop/documents.nix create mode 100644 desktop/fm.nix create mode 100644 desktop/gfx-env.nix create mode 100644 desktop/hw.nix create mode 100644 desktop/input.nix create mode 100644 desktop/integrations.nix create mode 100644 desktop/kernel.nix create mode 100644 desktop/logout.nix rename {home/dots/wlogout => desktop/logout}/layout (100%) create mode 100644 desktop/logout/style.css rename home/modules/media-players.nix => desktop/media.nix (70%) create mode 100644 desktop/network.nix rename home/programs/bitwarden.nix => desktop/password-manager.nix (59%) rename home/modules/theming.nix => desktop/platform-themes.nix (75%) rename home/util/ez.nix => desktop/quick-services.nix (64%) create mode 100644 desktop/rice.nix create mode 100644 desktop/shell.nix rename {system/modules => desktop}/sound.nix (100%) create mode 100644 desktop/udisks.nix create mode 100644 desktop/webapps.nix rename {home/util => desktop/webapps}/firefox-webapp.nix (95%) rename {home/util => desktop/webapps}/local-webapp.nix (97%) create mode 100644 desktop/wm.nix delete mode 100644 flakes/comfyui-plugins/essentials/default.nix delete mode 100644 flakes/comfyui-plugins/flake.lock delete mode 100644 flakes/comfyui-plugins/flake.nix delete mode 100644 flakes/comfyui-plugins/gguf/default.nix delete mode 100644 flakes/comfyui-plugins/openpose/default.nix delete mode 100644 flakes/comfyui-plugins/openpose/openpose_no_update.patch delete mode 100644 flakes/comfyui-plugins/tensorrt/default.nix delete mode 100644 flakes/comfyui/default.nix delete mode 100644 flakes/comfyui/flake.lock delete mode 100644 flakes/comfyui/flake.nix delete mode 100644 flakes/comfyui/folder_paths.patch delete mode 100644 flakes/comfyui/module.nix delete mode 100644 flakes/comfyui/spandrel.nix delete mode 100644 flakes/niri-session-manager/flake.lock delete mode 100644 flakes/niri-session-manager/flake.nix delete mode 100644 home/bolt.nix delete mode 100644 home/dots/Xresources delete mode 100644 home/dots/wlogout/style.css delete mode 100644 home/dots/zsh delete mode 100644 home/home.nix delete mode 100755 home/homepkgs/culr.nix delete mode 100644 home/icons/syncthing.png delete mode 100644 home/modules/chat.nix delete mode 100644 home/modules/cli.nix delete mode 100644 home/modules/creative.nix delete mode 100644 home/modules/desktop.nix delete mode 100644 home/modules/documents.nix delete mode 100644 home/modules/niri.nix delete mode 100644 home/modules/webapps.nix delete mode 100644 home/plank.nix delete mode 100644 home/programs/wlogout.nix delete mode 100644 home/util/name.nix create mode 100644 hosts/adrift/boot.nix create mode 100644 hosts/adrift/fs.nix create mode 100644 hosts/adrift/hw.nix create mode 100644 hosts/adrift/id.nix create mode 100644 hosts/adrift/power.nix create mode 100644 hosts/quiver/boot.nix create mode 100644 hosts/quiver/fs.nix create mode 100644 hosts/quiver/hw.nix rename system/modules/sydney.nix => hosts/quiver/id.nix (71%) create mode 100644 hosts/quiver/input.nix create mode 100644 hosts/quiver/llm.nix create mode 100644 hosts/quiver/outputs.nix create mode 100644 hosts/quiver/stateversion.nix delete mode 100644 system/adrift.nix delete mode 100644 system/configuration.nix delete mode 100644 system/modules/anal-retentive.nix delete mode 100644 system/modules/culr.nix delete mode 100644 system/modules/network.nix delete mode 100644 system/modules/nix-meta.nix delete mode 100644 system/modules/term.nix delete mode 100644 system/modules/wm.nix delete mode 100644 system/quiver.nix delete mode 100644 system/servers/atagen-vps/reflector.nix delete mode 100644 system/servers/rhizome-vps/configuration.nix delete mode 100644 system/servers/rhizome-vps/flake.nix delete mode 100644 system/servers/rhizome-vps/hardware-configuration.nix delete mode 100644 system/servers/rhizome-vps/rhizome.nix create mode 100644 util/create.nix delete mode 100644 util/get-modules.nix rename inputs.nix => util/inputs.nix (81%) create mode 100644 util/recursively-import.nix diff --git a/.gitignore b/.gitignore index 334079b..b987ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ mullvad/inactive result *.key *.pub_key -hosts/ +hosts/reflector diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index ec57d20..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "rhizome-vps"] - path = rhizome-vps - url = https://git.rhizome.tf/rhizome/server-config diff --git a/TODO b/TODO deleted file mode 100644 index abc7c3a..0000000 --- a/TODO +++ /dev/null @@ -1,7 +0,0 @@ -REPLACE HOME MANAGER WITH -pkgs.writers and HJEM - -implement agenix - -figure out a way to get firefox policies and plugins set up in webapps - diff --git a/home/icons/fb_msg.png b/assets/fb_msg.png similarity index 100% rename from home/icons/fb_msg.png rename to assets/fb_msg.png diff --git a/home/icons/ms_teams.png b/assets/ms_teams.png similarity index 100% rename from home/icons/ms_teams.png rename to assets/ms_teams.png diff --git a/home/icons/ollama.png b/assets/ollama.png similarity index 100% rename from home/icons/ollama.png rename to assets/ollama.png diff --git a/home/icons/openwebui.png b/assets/openwebui.png similarity index 100% rename from home/icons/openwebui.png rename to assets/openwebui.png diff --git a/home/icons/winlogo.png b/assets/winlogo.png similarity index 100% rename from home/icons/winlogo.png rename to assets/winlogo.png diff --git a/base/cli.nix b/base/cli.nix new file mode 100644 index 0000000..9782eab --- /dev/null +++ b/base/cli.nix @@ -0,0 +1,25 @@ +{ + pkgs, + ... +}: +{ + environment.systemPackages = builtins.attrValues { + inherit (pkgs) + curl + eza + git + ; + }; + hm.home.packages = builtins.attrValues { + inherit (pkgs) + btop + bat + ripgrep + fd + lazygit + zoxide + zellij + ouch + ; + }; +} diff --git a/base/debloat.nix b/base/debloat.nix new file mode 100644 index 0000000..64e9788 --- /dev/null +++ b/base/debloat.nix @@ -0,0 +1,13 @@ +{ lib, ... }: +{ + + # misc perl + system.disableInstallerTools = true; + programs.less.lessopen = null; + programs.command-not-found.enable = false; + boot.enableContainers = false; + boot.loader.grub.enable = false; + environment.defaultPackages = lib.mkDefault [ ]; + documentation.info.enable = false; + system.tools.nixos-option.enable = false; +} diff --git a/system/modules/docs.nix b/base/docs.nix similarity index 100% rename from system/modules/docs.nix rename to base/docs.nix diff --git a/home/programs/helix.nix b/base/helix.nix similarity index 99% rename from home/programs/helix.nix rename to base/helix.nix index f6d1f3f..8015c0a 100644 --- a/home/programs/helix.nix +++ b/base/helix.nix @@ -8,7 +8,7 @@ let pal = rice.palette.hex; in { - programs.helix = { + hm.programs.helix = { enable = true; package = inputs.helix.packages.${pkgs.system}.helix; themes = with pal; { diff --git a/base/network.nix b/base/network.nix new file mode 100644 index 0000000..9bdb40e --- /dev/null +++ b/base/network.nix @@ -0,0 +1,4 @@ +{ lib, ... }: +{ + networking.useDHCP = lib.mkDefault true; +} diff --git a/base/nix/gc.nix b/base/nix/gc.nix new file mode 100644 index 0000000..9d36665 --- /dev/null +++ b/base/nix/gc.nix @@ -0,0 +1,27 @@ +{ pkgs, inputs, ... }: +{ + imports = [ + inputs.angrr.nixosModules.angrr + ]; + + nix.gc = { + automatic = true; + dates = "weekly"; + persistent = true; + options = "--delete-older-than 14d"; + }; + + hm.nix.gc = { + automatic = true; + frequency = "weekly"; + options = "--delete-older-than 14d"; + }; + + services.angrr = { + enable = true; + enableNixGcIntegration = true; + period = "2weeks"; + package = inputs.angrr.packages.${pkgs.system}.default; + }; + +} diff --git a/base/nix/managers.nix b/base/nix/managers.nix new file mode 100644 index 0000000..c42886a --- /dev/null +++ b/base/nix/managers.nix @@ -0,0 +1,19 @@ +{ mainUser, ... }: +{ + programs.meat = { + enable = true; + flake = "/home/${mainUser}/.nix"; + }; + + # services.smooooth = { + # enable = true; + # path = "/home/${mainUser}/.nix"; + # blockers = [ + # "hx" + # { + # nix = "die"; + # } + # ]; + # nixPackage = pkgs.lix; + # }; +} diff --git a/base/nix/meat.nix b/base/nix/meat.nix new file mode 100644 index 0000000..4be7fdf --- /dev/null +++ b/base/nix/meat.nix @@ -0,0 +1,10 @@ +{ inputs, mainUser, ... }: +{ + imports = [ + inputs.meat.nixosModules.meat + ]; + programs.meat = { + enable = true; + flake = "/home/${mainUser}/.nix"; + }; +} diff --git a/base/nix/nixpkgs.nix b/base/nix/nixpkgs.nix new file mode 100644 index 0000000..a68d4ac --- /dev/null +++ b/base/nix/nixpkgs.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + nixpkgs = { + config = { + allowUnfree = true; + allowUnfreePredicate = _: true; + }; + }; +} diff --git a/base/nix/settings.nix b/base/nix/settings.nix new file mode 100644 index 0000000..a436d62 --- /dev/null +++ b/base/nix/settings.nix @@ -0,0 +1,26 @@ +{ inputs, ... }: +{ + imports = [ + inputs.lix-module.nixosModules.default + ]; + + nix = { + settings = { + experimental-features = [ + "nix-command" + "flakes" + "pipe-operator" + ]; + substitute = true; + }; + extraOptions = '' + keep-outputs = true + keep-derivations = true + ''; + optimise.automatic = true; + }; + + system.nixos.tags = [ "fatcock-xxl" ]; + + home-manager.useGlobalPkgs = true; +} diff --git a/system/substituters.nix b/base/nix/substituters.nix similarity index 100% rename from system/substituters.nix rename to base/nix/substituters.nix diff --git a/base/nix/tools.nix b/base/nix/tools.nix new file mode 100644 index 0000000..e809dce --- /dev/null +++ b/base/nix/tools.nix @@ -0,0 +1,21 @@ +{ pkgs, inputs, ... }: +{ + + environment.systemPackages = builtins.attrValues { + inherit (pkgs) + home-manager + cachix + nixfmt-rfc-style + ; + inherit (inputs.nil.packages.${pkgs.system}) nil; + }; + hm.imports = [ + inputs.nix-index-database.hmModules.nix-index + ]; + imports = [ + inputs.nix-index-database.nixosModules.nix-index + ]; + programs.nix-index-database.comma.enable = true; + programs.nix-index.enableZshIntegration = false; + programs.nix-index.enableBashIntegration = false; +} diff --git a/base/systemd.nix b/base/systemd.nix new file mode 100644 index 0000000..ab0327b --- /dev/null +++ b/base/systemd.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + systemd.services."user@".serviceConfig.Delegate = "memory pids cpu cpuset"; + systemd.user.extraConfig = "LogLevel=debug"; + hm.systemd.user.startServices = "sd-switch"; +} diff --git a/home/programs/kitty.nix b/base/terminal.nix similarity index 60% rename from home/programs/kitty.nix rename to base/terminal.nix index aa5c486..1c2e7af 100644 --- a/home/programs/kitty.nix +++ b/base/terminal.nix @@ -1,17 +1,46 @@ { + pkgs, rice, + inputs, ... }: let - pal = rice.palette.hex; + inherit (pkgs) fish; in { - programs.kitty = { + imports = [ + inputs.culr.nixosModules.culr + ]; + programs.culr = { + enable = true; + pattern = "rainbow-split"; + }; + programs.fish = { + enable = true; + }; + programs.zoxide = { + enable = true; + enableFishIntegration = true; + }; + environment.systemPackages = [ + fish + ]; + environment.shells = [ fish ]; + users.defaultUserShell = fish; + console = { + font = "Lat2-Terminus16"; + }; + + environment.sessionVariables = { + EDITOR = "hx"; + }; + + hm.programs.kitty = { enable = true; font = { inherit (rice.fonts.monospace) name size; }; - settings = with pal; { + settings = with rice.palette.hex; { foreground = util.fg; background = util.bg; inherit (util) cursor; diff --git a/base/users.nix b/base/users.nix new file mode 100644 index 0000000..0514ece --- /dev/null +++ b/base/users.nix @@ -0,0 +1,16 @@ +{ lib, mainUser, ... }: +{ + services.userborn.enable = lib.mkDefault true; + nix.settings.trusted-users = [ mainUser ]; + users.users.${mainUser} = { + isNormalUser = true; + extraGroups = [ + "wheel" + ]; + }; + + hm.config.home = { + username = mainUser; + homeDirectory = "/home/${mainUser}"; + }; +} diff --git a/create.nix b/create.nix deleted file mode 100644 index ba939a8..0000000 --- a/create.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ - system, - inputs, - sharedModules, - ... -}: -with inputs; -let - nix-rice = import "${inputs.nix-rice}/lib.nix" { - inherit (nixpkgs) lib; - kitty-themes-src = { }; - }; - rice = import ./rice { - inherit - inputs - system - nix-rice - ; - }; -in -{ - systems = - definitions: - nixpkgs.lib.mapAttrs ( - name: info: - nixpkgs.lib.nixosSystem { - inherit system; - specialArgs = { - inherit inputs rice; - mainUser = info.user; - }; - modules = - [ - ./system/${name}.nix - home-manager.nixosModules.home-manager - { - home-manager = { - useGlobalPkgs = true; - extraSpecialArgs = { - inherit inputs rice nix-rice; - mainUser = info.user; - }; - users.${info.user}.imports = [ - ./home/${info.user}.nix - ] ++ info.hmImports or [ ]; - }; - } - ] - ++ info.imports or [ ] - ++ sharedModules; - } - ) definitions; -} diff --git a/desktop/audio-control.nix b/desktop/audio-control.nix new file mode 100644 index 0000000..c7d6a12 --- /dev/null +++ b/desktop/audio-control.nix @@ -0,0 +1,13 @@ +{ + pkgs, + ... +}: +{ + hm.home.packages = builtins.attrValues { + inherit (pkgs) + avizo + playerctl + ; + }; + +} diff --git a/desktop/binds.nix b/desktop/binds.nix new file mode 100644 index 0000000..7a2bcc0 --- /dev/null +++ b/desktop/binds.nix @@ -0,0 +1,119 @@ +{ + pkgs, + lib, + config, + inputs, + ... +}: +let + inherit (lib) + range + nameValuePair + mapAttrs' + mergeAttrsList + ; + inherit (builtins) listToAttrs replaceStrings; + inherit (config.hm.lib.niri) actions; + hBinds = { + H = "left"; + L = "right"; + }; + vBinds = { + J = "down"; + K = "up"; + }; + makeDirBind = + mods: cmd: keys: + mapAttrs' ( + key: dir: + nameValuePair "${mods}+${key}" { + action = actions."${replaceStrings [ "$DIR" ] [ "${dir}" ] "${cmd}"}"; + } + ) keys; + makeWsBind = + mods: cmd: + listToAttrs ( + map (num: { + name = "${mods}+${builtins.toString num}"; + value = { + action."${cmd}" = num; + }; + }) (range 1 6) + ); + tagctl = lib.getExe' inputs.niri-tag.packages.${pkgs.system}.unstable "tagctl"; + makeTagBind = + mods: cmd: + listToAttrs ( + map (num: { + name = "${mods}+${builtins.toString num}"; + value = { + action.spawn = [ + tagctl + cmd + (builtins.toString num) + ]; + }; + }) (range 1 6) + ); +in +{ + hm.programs.niri.settings.binds = mergeAttrsList [ + { + "Mod+D".action.spawn = [ + "qs" + "ipc" + "call" + "launch" + "toggle" + ]; + "Mod+F".action.spawn = "firefox"; + "Mod+E".action.spawn = "nautilus"; + "Mod+Return".action.spawn = "kitty"; + "Mod+Shift+E".action.spawn = "wlogout"; + "Mod+Equal".action.spawn = "bitwarden"; + "Mod+Shift+Q".action = actions.close-window; + "Mod+Shift+S".action = actions.screenshot; + "Mod+R".action = actions.switch-preset-column-width; + "Mod+Shift+R".action = actions.maximize-column; + "XF86AudioRaiseVolume".action.spawn = [ + "volumectl" + "-u" + "up" + ]; + "XF86AudioLowerVolume".action.spawn = [ + "volumectl" + "-u" + "down" + ]; + "XF86AudioMute".action.spawn = [ + "volumectl" + "toggle-mute" + ]; + "XF86AudioStop".action.spawn = [ + "playerctl" + "stop" + ]; + "XF86AudioPlay".action.spawn = [ + "playerctl" + "play-pause" + ]; + "XF86AudioNext".action.spawn = [ + "playerctl" + "next" + ]; + "XF86AudioPrev".action.spawn = [ + "playerctl" + "previous" + ]; + "Mod+Space".action = actions.toggle-window-floating; + } + (makeDirBind "Mod" "focus-window-$DIR" vBinds) + (makeDirBind "Mod" "focus-column-or-monitor-$DIR" hBinds) + (makeDirBind "Mod+Shift" "move-column-$DIR-or-to-monitor-$DIR" hBinds) + (makeDirBind "Mod+Ctrl" "consume-or-expel-window-$DIR" hBinds) + (makeDirBind "Mod+Ctrl" "move-window-$DIR" vBinds) + (makeTagBind "Mod" "toggle-tag") + (makeTagBind "Mod+Shift" "toggle") + (makeTagBind "Mod+Ctrl" "exclusive-tag") + ]; +} diff --git a/system/modules/bootloader.nix b/desktop/boot.nix similarity index 85% rename from system/modules/bootloader.nix rename to desktop/boot.nix index 3bbf4f3..4b8baef 100644 --- a/system/modules/bootloader.nix +++ b/desktop/boot.nix @@ -1,8 +1,9 @@ +{ rice, ... }: { - rice, - ... -}: -{ + boot.tmp.useTmpfs = true; + + boot.initrd.systemd.enable = true; + boot.loader.limine = { enable = true; style = @@ -32,10 +33,5 @@ backdrop = pal.util.bg; }; maxGenerations = 5; - extraEntries = '' - /Windows - protocol: efi - path: boot():/EFI/Microsoft/Boot/bootmgfw.efi - ''; }; } diff --git a/home/programs/firefox.nix b/desktop/browser.nix similarity index 99% rename from home/programs/firefox.nix rename to desktop/browser.nix index cfbdf61..124cc95 100644 --- a/home/programs/firefox.nix +++ b/desktop/browser.nix @@ -21,7 +21,7 @@ let }; in { - programs.firefox = { + hm.programs.firefox = { enable = true; policies = { diff --git a/desktop/chat.nix b/desktop/chat.nix new file mode 100644 index 0000000..60663ca --- /dev/null +++ b/desktop/chat.nix @@ -0,0 +1,18 @@ +{ config, pkgs, ... }: +{ + hm.programs.firefox.webapps = { + "Microsoft-Teams" = { + url = "https://teams.microsoft.com"; + extraSettings = config.hm.programs.firefox.profiles.default.settings; + name = "Microsoft Teams"; + icon = ../assets/ms_teams.png; + }; + "Facebook-Messenger" = { + url = "https://www.messenger.com"; + extraSettings = config.hm.programs.firefox.profiles.default.settings; + name = "Facebook Messenger"; + icon = ../assets/fb_msg.png; + }; + }; + hm.home.packages = [ pkgs.cinny-desktop ]; +} diff --git a/home/modules/dev.nix b/desktop/dev.nix similarity index 61% rename from home/modules/dev.nix rename to desktop/dev.nix index 6b2aad8..63721f6 100644 --- a/home/modules/dev.nix +++ b/desktop/dev.nix @@ -1,18 +1,13 @@ { pkgs, - lib, - rice, ... }: let getPkgs = builtins.attrValues; in { - # imports = [ - # ../programs/vscode.nix - # ]; - home.packages = + hm.home.packages = getPkgs { inherit (pkgs) direnv @@ -65,48 +60,7 @@ in }) ]; - programs.zed-editor = { - enable = false; - extensions = [ - "nix" - "rust" - "ocaml" - "kanagawa-themes" - ]; - userSettings = { - features = { - copilot = false; - }; - buffer_font_family = rice.fonts.monospace.name; - buffer_font_size = rice.fonts.monospace.size; - theme = { - mode = "dark"; - dark = "Kanagawa Dragon"; - }; - telemetry = { - metrics = false; - diagnostics = false; - }; - vim_mode = true; - assistant = { - default_model = { - provider = "ollama"; - model = "llama3.2"; - }; - inline_alternatives = { - provider = "ollama"; - model = "starcoder2:3b"; - }; - }; - language_models = { - ollama = { - api_url = "http://localhost:11434"; - }; - }; - }; - }; - - programs.direnv = { + hm.programs.direnv = { enable = true; nix-direnv = { enable = true; @@ -114,13 +68,10 @@ in enableFishIntegration = true; }; - programs.git = { + hm.programs.git = { enable = true; userName = "atagen"; userEmail = "boss@atagen.co"; - extraConfig = { - credential.helper = "rbw"; - }; }; } diff --git a/desktop/documents.nix b/desktop/documents.nix new file mode 100644 index 0000000..1fb700f --- /dev/null +++ b/desktop/documents.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: +{ + hm.home.packages = builtins.attrValues { + inherit (pkgs) + libreoffice + thunderbird + ; + }; +} diff --git a/desktop/fm.nix b/desktop/fm.nix new file mode 100644 index 0000000..e93af84 --- /dev/null +++ b/desktop/fm.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + hm.home.packages = builtins.attrValues { + inherit (pkgs) + file-roller + nautilus + ; + }; + +} diff --git a/desktop/gfx-env.nix b/desktop/gfx-env.nix new file mode 100644 index 0000000..ac514a0 --- /dev/null +++ b/desktop/gfx-env.nix @@ -0,0 +1,14 @@ +{ + ... +}: +{ + environment.sessionVariables = { + NIXOS_OZONE_WL = "1"; + GBM_BACKEND = "nvidia-drm"; + NVD_BACKEND = "direct"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + LIBVA_DRIVER_NAME = "nvidia"; + __GL_GSYNC_ALLOWED = "1"; + __GL_VRR_ALLOWED = "1"; + }; +} diff --git a/desktop/hw.nix b/desktop/hw.nix new file mode 100644 index 0000000..46cc98f --- /dev/null +++ b/desktop/hw.nix @@ -0,0 +1,5 @@ +{ ... }: +{ + hardware.enableRedistributableFirmware = true; + hardware.enableAllFirmware = true; +} diff --git a/desktop/input.nix b/desktop/input.nix new file mode 100644 index 0000000..7db5e0d --- /dev/null +++ b/desktop/input.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + services.libinput.enable = true; + console.useXkbConfig = true; + services.xserver.xkb.options = "caps:swapescape"; +} diff --git a/desktop/integrations.nix b/desktop/integrations.nix new file mode 100644 index 0000000..7697022 --- /dev/null +++ b/desktop/integrations.nix @@ -0,0 +1,38 @@ +{ + pkgs, + ... +}: +{ + xdg.autostart.enable = true; + xdg.portal.enable = true; + + hm.xdg = { + enable = true; + portal = + let + gtk = pkgs.xdg-desktop-portal-gtk; + gnome = pkgs.xdg-desktop-portal-gnome; + in + { + enable = true; + config = { + common = { + default = [ + "gnome" + ]; + }; + }; + extraPortals = [ + gnome + gtk + ]; + }; + }; + + environment.pathsToLink = [ + "/share/xdg-desktop-portal" + "/share/applications" + ]; + + security.polkit.enable = true; +} diff --git a/desktop/kernel.nix b/desktop/kernel.nix new file mode 100644 index 0000000..41c8ac2 --- /dev/null +++ b/desktop/kernel.nix @@ -0,0 +1,11 @@ +{ pkgs, inputs, ... }: +{ + imports = [ + inputs.nyx.nixosModules.default + ]; + services.scx = { + enable = true; + scheduler = "scx_bpfland"; + }; + boot.kernelPackages = pkgs.linuxPackages_cachyos; +} diff --git a/desktop/logout.nix b/desktop/logout.nix new file mode 100644 index 0000000..d16dfbf --- /dev/null +++ b/desktop/logout.nix @@ -0,0 +1,44 @@ +{ + rice, + pkgs, + ... +}: +let + pal = rice.palette.hex; +in +{ + hm.programs.wlogout = { + enable = true; + package = pkgs.wleave; + layout = builtins.fromJSON (builtins.readFile ./logout/layout); + style = + with pal; + (builtins.replaceStrings + [ + "/usr/share/wlogout" + "/etc/wlogout" + "#WINBG" + "#BTNCOL" + "#BTNBG" + "#BTNFOCUSBG" + "#WINLOGO" + ] + [ + "${pkgs.wlogout}/share/wlogout" + "${pkgs.wlogout}/etc/wlogout" + util.bg + bright.yellow + util.bg + normal.black + (builtins.path { + name = "winlogo"; + path = ../assets/winlogo.png; + sha256 = "7c1ff96b553c7a7ca3a7b7cf8efe830ab7feea92355aed288a10ee7347c24108"; + }) + ] + (builtins.readFile ./logout/style.css) + ); + }; + + hm.home.packages = [ pkgs.wleave ]; +} diff --git a/home/dots/wlogout/layout b/desktop/logout/layout similarity index 100% rename from home/dots/wlogout/layout rename to desktop/logout/layout diff --git a/desktop/logout/style.css b/desktop/logout/style.css new file mode 100644 index 0000000..4689381 --- /dev/null +++ b/desktop/logout/style.css @@ -0,0 +1,48 @@ +* { + background-image: none; +} +window { + background-color: #WINBG; +} +button { + color: #BTNCOL; + background-color: #BTNBG; + border-style: solid; + border-width: 2px; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; +} + +button:focus, button:active, button:hover { + background-color: #BTNFOCUSBG; + outline-style: none; +} + +#lock { + background-image: image(url("/usr/share/wlogout/assets/lock.png"), url("/usr/local/share/wlogout/assets/lock.png")); +} + +#logout { + background-image: image(url("/usr/share/wlogout/assets/logout.png"), url("/usr/local/share/wlogout/assets/logout.png")); +} + +#suspend { + background-image: image(url("/usr/share/wlogout/assets/suspend.png"), url("/usr/local/share/wlogout/assets/suspend.png")); +} + +#hibernate { + background-image: image(url("/usr/share/wlogout/assets/hibernate.png"), url("/usr/local/share/wlogout/assets/hibernate.png")); +} + +#shutdown { + background-image: image(url("/usr/share/wlogout/assets/shutdown.png"), url("/usr/local/share/wlogout/assets/shutdown.png")); +} + +#reboot { + background-image: image(url("/usr/share/wlogout/assets/reboot.png"), url("/usr/local/share/wlogout/assets/reboot.png")); +} + +#windows { + background-image: image(url("#WINLOGO")) +} diff --git a/home/modules/media-players.nix b/desktop/media.nix similarity index 70% rename from home/modules/media-players.nix rename to desktop/media.nix index 87270a5..8cc11f8 100644 --- a/home/modules/media-players.nix +++ b/desktop/media.nix @@ -1,12 +1,11 @@ { pkgs, ... }: { - home.packages = builtins.attrValues { + hm.home.packages = builtins.attrValues { inherit (pkgs) mpv imv resonance zathura - playerctl feishin nicotine-plus ; diff --git a/desktop/network.nix b/desktop/network.nix new file mode 100644 index 0000000..20d18de --- /dev/null +++ b/desktop/network.nix @@ -0,0 +1,15 @@ +{ ... }: +{ + networking.networkmanager.enable = true; + systemd.services.NetworkManager-wait-online.enable = true; + services.resolved = { + enable = true; + fallbackDns = [ + "103.1.206.179" + "168.138.8.38" + "168.138.12.137" + ]; + dnssec = "false"; + }; + services.mullvad-vpn.enable = true; +} diff --git a/home/programs/bitwarden.nix b/desktop/password-manager.nix similarity index 59% rename from home/programs/bitwarden.nix rename to desktop/password-manager.nix index 94f79b6..1fd5cab 100644 --- a/home/programs/bitwarden.nix +++ b/desktop/password-manager.nix @@ -1,6 +1,6 @@ { pkgs, ... }: { - programs.rbw = { + hm.programs.rbw = { enable = true; settings = { email = "boss@atagen.co"; @@ -8,6 +8,7 @@ base_url = "https://v.atagen.co"; }; }; + hm.programs.git.extraConfig.credential.helper = "rbw"; - home.packages = [ pkgs.bitwarden ]; + hm.home.packages = [ pkgs.bitwarden ]; } diff --git a/home/modules/theming.nix b/desktop/platform-themes.nix similarity index 75% rename from home/modules/theming.nix rename to desktop/platform-themes.nix index 7436798..80c99f8 100644 --- a/home/modules/theming.nix +++ b/desktop/platform-themes.nix @@ -1,17 +1,20 @@ { pkgs, rice, ... }: { - home.packages = [ + # for quickshell + qt.enable = true; + + hm.home.packages = [ pkgs.gtk-engine-murrine ]; - fonts.fontconfig.enable = true; + hm.fonts.fontconfig.enable = true; - qt = { + hm.qt = { enable = true; style.name = "adwaita-dark"; platformTheme.name = "adwaita"; }; - gtk = { + hm.gtk = { enable = true; theme = { inherit (rice.gtk-theme) package name; diff --git a/home/util/ez.nix b/desktop/quick-services.nix similarity index 64% rename from home/util/ez.nix rename to desktop/quick-services.nix index 678c565..9e97a4b 100644 --- a/home/util/ez.nix +++ b/desktop/quick-services.nix @@ -4,27 +4,20 @@ ... }: { - options = { - ezServices = + config.hm.options = { + quickServices = with lib; mkOption { type = with types; attrsOf str; default = { }; }; - ezOneShots = + quickOneShots = with lib; mkOption { type = with types; attrsOf str; default = { }; }; - ezConf = - with lib; - mkOption { - type = with types; attrsOf path; - default = { }; - }; - # for specifying an additional systemd target extraTarget = with lib; @@ -34,21 +27,21 @@ }; }; - config = { + config.hm.config = { systemd.user.services = builtins.mapAttrs (name: cmd: { Unit = { Description = "${name}"; - Requires = [ "graphical-session.target" ] ++ config.extraTarget; - After = [ "graphical-session.target" ] ++ config.extraTarget; + Requires = [ "graphical-session.target" ] ++ config.hm.extraTarget; + After = [ "graphical-session.target" ] ++ config.hm.extraTarget; }; Service = { ExecStart = cmd; }; Install = { - WantedBy = [ "graphical-session.target" ] ++ config.extraTarget; + WantedBy = [ "graphical-session.target" ] ++ config.hm.extraTarget; }; - }) config.ezServices + }) config.hm.quickServices // builtins.mapAttrs (name: cmd: { Unit = { Description = "${name}"; @@ -61,11 +54,6 @@ Install = { WantedBy = [ "graphical-session.target" ] ++ config.extraTarget; }; - }) config.ezOneShots; - - xdg.configFile = builtins.mapAttrs (_name: value: { - enable = true; - source = value; - }) config.ezConf; + }) config.hm.quickOneShots; }; } diff --git a/desktop/rice.nix b/desktop/rice.nix new file mode 100644 index 0000000..244a0c4 --- /dev/null +++ b/desktop/rice.nix @@ -0,0 +1,25 @@ +{ + pkgs, + lib, + inputs, + rice, + ... +}: +{ + hm.home.packages = + let + inherit (rice) icons fonts cursor; + in + fonts.pkgs + ++ icons.pkgs + ++ [ + cursor.package + ]; + _module.args.rice = import ../rice { + inherit + inputs + lib + pkgs + ; + }; +} diff --git a/desktop/shell.nix b/desktop/shell.nix new file mode 100644 index 0000000..58e8f24 --- /dev/null +++ b/desktop/shell.nix @@ -0,0 +1,62 @@ +{ + pkgs, + lib, + inputs, + rice, + ... +}: +let + inherit (lib) getExe getExe'; +in +{ + # quickshell stuff + environment.systemPackages = + builtins.attrValues { + inherit (pkgs.kdePackages) qtbase qtdeclarative; + inherit (pkgs) wl-clipboard; + } + ++ [ + (inputs.quickshell.packages.${pkgs.system}.default.override { + withHyprland = false; + withI3 = false; + }) + ]; + + hm.systemd.user.services.quickshell = { + Unit.PartOf = [ "graphical-session.target" ]; + Unit.After = [ + "graphical-session.target" + "niri.service" + ]; + Install.WantedBy = [ "graphical-session.target" ]; + Service = { + ExecStart = "${getExe' (inputs.quickshell.packages.${pkgs.system}.default.override { + withHyprland = false; + withI3 = false; + }) "qs"}"; + }; + }; + + hm.quickServices = { + "swaync" = "${getExe pkgs.swaynotificationcenter}"; + "swaybg" = "${getExe pkgs.swaybg} -m fill -i ${rice.bg.src}"; + "avizo-service" = "${getExe' pkgs.avizo "avizo-service"}"; + "swayidle" = + let + niri = inputs.niri.packages.${pkgs.system}.niri-unstable; + systemctl = getExe' pkgs.systemd "systemctl"; + in + '' + ${lib.getExe pkgs.swayidle} -w \ + timeout 1800 '${systemctl} suspend' \ + timeout 600 '${niri} msg action power-off-monitors' + ''; + }; + + hm.systemd.user.targets.tray = { + Unit = { + Description = "Home Manager System Tray"; + Requires = [ "graphical-session.target" ]; + }; + }; +} diff --git a/system/modules/sound.nix b/desktop/sound.nix similarity index 100% rename from system/modules/sound.nix rename to desktop/sound.nix diff --git a/desktop/udisks.nix b/desktop/udisks.nix new file mode 100644 index 0000000..4f2ad7a --- /dev/null +++ b/desktop/udisks.nix @@ -0,0 +1,17 @@ +{ lib, pkgs, ... }: +{ + services.udisks2.enable = true; + hm.services.udiskie.enable = true; + # fix reliance on nonexistent graphical-session-pre.target + hm.systemd.user.services.udiskie = lib.mkForce { + Unit = { + Description = "udiskie mount daemon"; + After = [ ]; + PartOf = [ "graphical-session.target" ]; + }; + + Service.ExecStart = [ "${pkgs.udiskie}/bin/udiskie --appindicator" ]; + + Install.WantedBy = [ "graphical-session.target" ]; + }; +} diff --git a/desktop/webapps.nix b/desktop/webapps.nix new file mode 100644 index 0000000..4559686 --- /dev/null +++ b/desktop/webapps.nix @@ -0,0 +1,14 @@ +{ config, ... }: +{ + imports = [ + ./webapps/firefox-webapp.nix + ]; + hm.programs.firefox.webapps = { + "Open-WebUI" = { + url = "http://127.0.0.1:8088"; + extraSettings = config.hm.programs.firefox.profiles.default.settings; + name = "Open-WebUI"; + icon = ../assets/openwebui.png; + }; + }; +} diff --git a/home/util/firefox-webapp.nix b/desktop/webapps/firefox-webapp.nix similarity index 95% rename from home/util/firefox-webapp.nix rename to desktop/webapps/firefox-webapp.nix index 7dbe7a5..e78d120 100644 --- a/home/util/firefox-webapp.nix +++ b/desktop/webapps/firefox-webapp.nix @@ -96,7 +96,7 @@ let ) cfg; in { - options.programs.firefox.webapps = mkOption { + config.hm.options.programs.firefox.webapps = mkOption { default = { }; type = @@ -210,8 +210,8 @@ in description = "Websites to create special site-specific Firefox instances for."; }; - config = { - programs.firefox.profiles = make-app-profiles (enumerate config.programs.firefox.webapps); + config.hm.config = { + programs.firefox.profiles = make-app-profiles (enumerate config.hm.programs.firefox.webapps); xdg.desktopEntries = mapAttrs (name: cfg: { inherit (cfg) @@ -235,7 +235,7 @@ in exec = concatStringsSep " " ( [ - "${getExe config.programs.firefox.package}" + "${getExe config.hm.programs.firefox.package}" "--name" "${name}" "--app-id" @@ -243,7 +243,7 @@ in "--class" "${name}" "-P" - "${config.programs.firefox.profiles."home-manager-webapp-${name}".path}" + "${config.hm.programs.firefox.profiles."home-manager-webapp-${name}".path}" "--no-remote" ] ++ cfg.extraArgs @@ -255,6 +255,6 @@ in StartupWMClass = "${name}"; NoDisplay = lib.boolToString cfg.hidden; }; - }) config.programs.firefox.webapps; + }) config.hm.programs.firefox.webapps; }; } diff --git a/home/util/local-webapp.nix b/desktop/webapps/local-webapp.nix similarity index 97% rename from home/util/local-webapp.nix rename to desktop/webapps/local-webapp.nix index a42c977..25d1268 100644 --- a/home/util/local-webapp.nix +++ b/desktop/webapps/local-webapp.nix @@ -29,7 +29,7 @@ let nameValuePair "${name}-client" { inherit (cfg) name; url = "http://127.0.0.1:${builtins.toString cfg.port}"; - extraSettings = config.programs.firefox.profiles.default.settings; + extraSettings = config.hm.programs.firefox.profiles.default.settings; hidden = true; } ) cfg; @@ -168,10 +168,10 @@ let '' }"; }) cfg; - cfg = config.localWebApps; + cfg = config.hm.localWebApps; in { - options.localWebApps = mkOption { + config.hm.options.localWebApps = mkOption { default = { }; type = with lib.types; @@ -240,7 +240,7 @@ in }); }; - config = { + config.hm.config = { programs.firefox.webapps = make-firefox cfg; systemd.user.targets = make-systemd-target cfg; diff --git a/desktop/wm.nix b/desktop/wm.nix new file mode 100644 index 0000000..ef59845 --- /dev/null +++ b/desktop/wm.nix @@ -0,0 +1,85 @@ +{ + pkgs, + mainUser, + rice, + inputs, + ... +}: +{ + imports = [ + inputs.niri.nixosModules.niri + inputs.niri-tag.nixosModules.niri-tag + ]; + hm.programs.niri.settings = { + input = { + warp-mouse-to-focus.enable = true; + }; + cursor = { + hide-after-inactive-ms = 5000; + hide-when-typing = true; + size = 16; + theme = rice.cursor.name; + }; + layout = { + always-center-single-column = true; + gaps = 24; + default-column-width.proportion = 0.5; + preset-column-widths = map (p: { proportion = p; }) [ + (2.0 / 3.0) + 0.5 + (1.0 / 3.0) + ]; + focus-ring = + let + pal = rice.palette.hex; + in + { + active = { + color = pal.bright.yellow; + }; + inactive = { + color = pal.normal.black; + }; + }; + }; + prefer-no-csd = true; + hotkey-overlay.skip-at-startup = true; + window-rules = + let + v = 10.0; + in + [ + { + geometry-corner-radius = { + bottom-left = v; + bottom-right = 0.0; + top-left = 0.0; + top-right = v; + }; + clip-to-geometry = true; + } + ]; + }; + + services.greetd = { + enable = true; + restart = false; + settings = + let + session = { + command = "niri-session"; + user = "${mainUser}"; + }; + in + { + default_session = session; + initial_session = session; + }; + }; + programs.niri = { + enable = true; + package = inputs.niri.packages.${pkgs.system}.niri-unstable; + }; + services.niri-tag.enable = true; + +} diff --git a/entry.nix b/entry.nix index dd060a2..ce1b21d 100644 --- a/entry.nix +++ b/entry.nix @@ -1,33 +1,23 @@ let - inputs = import ./inputs.nix; - modules = import ./util/get-modules.nix inputs; - create = import ./create.nix { - system = "x86_64-linux"; - inherit inputs; - sharedModules = - with inputs; - (modules [ - culr - meat - niri - niri-tag - lix-module - angrr - arbys - # smooooth - ]) - ++ [ - nix-index-database.nixosModules.nix-index - ./system/substituters.nix - ]; - }; + create = import ./util/create.nix; in { nixosConfigurations = create.systems { quiver = { user = "bolt"; - imports = with inputs; (modules [ nyx ]); + imports = [ + ./base + ./desktop + ./hosts/quiver + ]; + }; + adrift = { + user = "plank"; + imports = [ + ./base + ./desktop + ./hosts/adrift + ]; }; - adrift.user = "plank"; }; } diff --git a/flake.nix b/flake.nix index a8caf69..941f2dc 100644 --- a/flake.nix +++ b/flake.nix @@ -2,42 +2,6 @@ description = "nixos config"; outputs = _: { }; - # outputs = - # inputs: - # with inputs; - # let - # modules = import ./util/get-modules.nix { - # inherit inputs; - # }; - # create = import ./create.nix { - # inherit inputs; - # system = "x86_64-linux"; - # sharedModules = - # (modules [ - # culr - # meat - # niri - # niri-tag - # lix-module - # angrr - # arbys - # # smooooth - # ]) - # ++ [ - # nix-index-database.nixosModules.nix-index - # ./system/substituters.nix - # ]; - # }; - # in - # { - # nixosConfigurations = create.systems { - # quiver = { - # user = "bolt"; - # imports = (modules [ nyx ]); - # }; - # adrift.user = "plank"; - # }; - # }; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; @@ -71,16 +35,6 @@ culr.url = "git+https://git.atagen.co/atagen/culr"; - # comfyui = { - # url = "path:./flakes/comfyui"; - # inputs.nixpkgs.follows = "nixpkgs"; - # }; - - # comfyui-plugins = { - # url = "path:./flakes/comfyui-plugins"; - # inputs.nixpkgs.follows = "nixpkgs"; - # }; - niri.url = "github:sodiboo/niri-flake"; hjem = { @@ -103,8 +57,6 @@ angrr.url = "github:linyinfeng/angrr"; - arbys.url = "path:/home/bolt/code/arbys"; - __flake-compat = { url = "git+https://git.lix.systems/lix-project/flake-compat.git"; flake = false; diff --git a/flakes/comfyui-plugins/essentials/default.nix b/flakes/comfyui-plugins/essentials/default.nix deleted file mode 100644 index e8b24ca..0000000 --- a/flakes/comfyui-plugins/essentials/default.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ - pkgs, - src, - python3Packages, - ... -}: -let - inherit (python3Packages) - numba - colour-science - rembg - pixeloe - transparent-background - ; -in -pkgs.stdenvNoCC.mkDerivation { - pname = "comfyui-essentials"; - version = "dev-${builtins.toString src.lastModified}"; - inherit src; - - propagatedBuildInputs = [ - numba - colour-science - rembg - pixeloe - transparent-background - ]; -} diff --git a/flakes/comfyui-plugins/flake.lock b/flakes/comfyui-plugins/flake.lock deleted file mode 100644 index ed0ef70..0000000 --- a/flakes/comfyui-plugins/flake.lock +++ /dev/null @@ -1,75 +0,0 @@ -{ - "nodes": { - "gguf": { - "flake": false, - "locked": { - "lastModified": 1736350217, - "narHash": "sha256-3RqFfvXdn9sCIlctqa14c2fvluSmJCR+llfZo/MV64o=", - "owner": "city96", - "repo": "ComfyUI-GGUF", - "rev": "5875c52f59baca3a9372d68c43a3775e21846fe0", - "type": "github" - }, - "original": { - "owner": "city96", - "repo": "ComfyUI-GGUF", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1738410390, - "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", - "path": "/nix/store/hjb1rqv2mfs5ny47amj2gsc8xk05x5g6-source", - "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", - "type": "path" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "openpose": { - "flake": false, - "locked": { - "lastModified": 1685841563, - "narHash": "sha256-GUjs8mIUFAbjJEVL+EsT44HG42mAiumKOBlBas1xxrM=", - "owner": "space-nuko", - "repo": "ComfyUI-OpenPose-Editor", - "rev": "4d8fe730acdb11ab2fcd592129d91d338d270adf", - "type": "github" - }, - "original": { - "owner": "space-nuko", - "repo": "ComfyUI-OpenPose-Editor", - "type": "github" - } - }, - "root": { - "inputs": { - "gguf": "gguf", - "nixpkgs": "nixpkgs", - "openpose": "openpose", - "tensorrt": "tensorrt" - } - }, - "tensorrt": { - "flake": false, - "locked": { - "lastModified": 1728519788, - "narHash": "sha256-tqiodF60IVlmvJknYxEwL0U7GIrrfl49k6Tg+8jGRVU=", - "owner": "comfyanonymous", - "repo": "ComfyUI_TensorRT", - "rev": "5bcc3f1e5c2424bb20bcb586e340c25ebe4a954f", - "type": "github" - }, - "original": { - "owner": "comfyanonymous", - "repo": "ComfyUI_TensorRT", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flakes/comfyui-plugins/flake.nix b/flakes/comfyui-plugins/flake.nix deleted file mode 100644 index 14c93b8..0000000 --- a/flakes/comfyui-plugins/flake.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - inputs = { - gguf = { - url = "github:city96/ComfyUI-GGUF"; - flake = false; - }; - - tensorrt = { - url = "github:comfyanonymous/ComfyUI_TensorRT"; - flake = false; - }; - - # needs some deps packaged - # essentials = { - # url = "github:cubiq/ComfyUI_essentials"; - # flake = false; - # }; - - openpose = { - url = "github:space-nuko/ComfyUI-OpenPose-Editor"; - flake = false; - }; - }; - - outputs = - { - self, - nixpkgs, - ... - }: - let - pkgs = import nixpkgs { - system = "x86_64-linux"; - }; - inherit (pkgs) lib callPackage; - inherit (builtins) mapAttrs; - filteredInputs = lib.filterAttrs (n: _v: n != "nixpkgs") self.inputs; - in - { - overlays.comfyui-plugins = final: _prev: { - comfyui-plugins = mapAttrs ( - name: value: final.callPackage ./${name}/default.nix { src = value; } - ) filteredInputs; - }; - packages.x86_64-linux = mapAttrs ( - name: value: callPackage ./${name}/default.nix { src = value; } - ) filteredInputs; - }; -} diff --git a/flakes/comfyui-plugins/gguf/default.nix b/flakes/comfyui-plugins/gguf/default.nix deleted file mode 100644 index 0d116c7..0000000 --- a/flakes/comfyui-plugins/gguf/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - pkgs, - src, - python3Packages, - ... -}: -let - inherit (python3Packages) gguf numpy pyyaml; -in -pkgs.stdenvNoCC.mkDerivation { - pname = "comfyui-gguf"; - version = "dev-${builtins.toString src.lastModified}"; - inherit src; - propagatedBuildInputs = [ - gguf - numpy - pyyaml - ]; - installPhase = '' - mkdir -p $out - cp -r * $out/ - ''; -} diff --git a/flakes/comfyui-plugins/openpose/default.nix b/flakes/comfyui-plugins/openpose/default.nix deleted file mode 100644 index 9adf02c..0000000 --- a/flakes/comfyui-plugins/openpose/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - pkgs, - src, - ... -}: -pkgs.stdenvNoCC.mkDerivation { - pname = "comfyui-openpose-editor"; - version = "dev-${builtins.toString src.lastModified}"; - inherit src; - - patches = [ - ./openpose_no_update.patch - ]; - - installPhase = '' - mkdir -p $out - cp -r * $out/ - cp js/* $out/ - ''; -} diff --git a/flakes/comfyui-plugins/openpose/openpose_no_update.patch b/flakes/comfyui-plugins/openpose/openpose_no_update.patch deleted file mode 100644 index 2f440de..0000000 --- a/flakes/comfyui-plugins/openpose/openpose_no_update.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/__init__.py b/__init__.py -index e4cf8bb..7d8f894 100644 ---- a/__init__.py -+++ b/__init__.py -@@ -35,6 +35,6 @@ def update_javascript(): - shutil.copy(src_file, dst_file) - - --update_javascript() -+# update_javascript() - - print('\033[34mOpenPose Editor: \033[92mLoaded\033[0m') diff --git a/flakes/comfyui-plugins/tensorrt/default.nix b/flakes/comfyui-plugins/tensorrt/default.nix deleted file mode 100644 index 383a2ac..0000000 --- a/flakes/comfyui-plugins/tensorrt/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ - pkgs, - src, - python3Packages, - ... -}: -let - inherit (python3Packages) tensorrt onnx; -in -pkgs.stdenvNoCC.mkDerivation { - pname = "comfyui-tensorrt"; - version = "dev-${builtins.toString src.lastModified}"; - inherit src; - - propagatedBuildInputs = [ - tensorrt - onnx - ]; - - installPhase = '' - mkdir -p $out - cp -r * $out - ''; -} diff --git a/flakes/comfyui/default.nix b/flakes/comfyui/default.nix deleted file mode 100644 index 1d4fb7f..0000000 --- a/flakes/comfyui/default.nix +++ /dev/null @@ -1,96 +0,0 @@ -{ - pkgs, - lib, - config, - comfyui, - comfy_dir ? "/run/user/1000/comfyui/", - spandrel, - plugins ? config.comfyui.plugins or [ ], - ... -}: -let - inherit (pkgs) python3; - inherit (pkgs.python3Packages) - torch - torchsde - torchvision - torchaudio - einops - transformers - tokenizers - sentencepiece - safetensors - aiohttp - pyyaml - pillow - scipy - tqdm - psutil - kornia - soundfile - ; - - python = python3.buildEnv.override { - extraLibs = [ - torch - torchsde - torchvision - torchaudio - einops - transformers - tokenizers - sentencepiece - safetensors - aiohttp - pyyaml - pillow - scipy - tqdm - psutil - kornia - soundfile - - spandrel - ] ++ plugins; - }; -in -pkgs.stdenvNoCC.mkDerivation { - name = "comfyui"; - pname = "comfyui"; - version = "dev-${builtins.toString comfyui.lastModified}"; - src = comfyui; - nativeBuildInputs = - let - inherit (pkgs) makeWrapper; - in - [ - makeWrapper - ]; - propagatedBuildInputs = - let - inherit (pkgs.cudaPackages) cudatoolkit; - in - [ - python - cudatoolkit - ]; - - patches = [ ./folder_paths.patch ]; - - installPhase = - let - launcher = pkgs.writeShellScript "launch.sh" '' - mkdir -p $COMFY_DIR/custom_nodes - mkdir -p $COMFY_DIR/models/{checkpoints,configs,loras,vae,clip,unet,diffusion_models,clip_vision,style_models,embeddings,diffusers,vae_approx,controlnet,gligen,upscale_models,hypernetworks,photomaker,classifiers} - ${python}/bin/python3 $COMFY/comfyui/main.py --output-directory $(mktemp) - ''; - in - '' - mkdir -p $out/comfyui - cp -r * $out/comfyui - mkdir -p $out/bin - makeWrapper ${launcher} $out/bin/comfyui --prefix PATH : ${lib.makeBinPath [ python ]} \ - --set PYTHONPATH ${lib.makeLibraryPath [ python ]} --set COMFY $out --set COMFY_DIR ${comfy_dir} - ''; - meta.mainProgram = "comfyui"; -} diff --git a/flakes/comfyui/flake.lock b/flakes/comfyui/flake.lock deleted file mode 100644 index 805bbb0..0000000 --- a/flakes/comfyui/flake.lock +++ /dev/null @@ -1,41 +0,0 @@ -{ - "nodes": { - "comfyui": { - "flake": false, - "locked": { - "lastModified": 1739165060, - "narHash": "sha256-DLiv96ynd+p4lXgvNMqgSklWFciLX+l+nXlu5MYVrg8=", - "owner": "comfyanonymous", - "repo": "ComfyUI", - "rev": "4027466c802d174d76347726d74de73c39acedb3", - "type": "github" - }, - "original": { - "owner": "comfyanonymous", - "repo": "ComfyUI", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1738410390, - "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", - "path": "/nix/store/hjb1rqv2mfs5ny47amj2gsc8xk05x5g6-source", - "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", - "type": "path" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "root": { - "inputs": { - "comfyui": "comfyui", - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flakes/comfyui/flake.nix b/flakes/comfyui/flake.nix deleted file mode 100644 index 58b690f..0000000 --- a/flakes/comfyui/flake.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ - inputs = { - comfyui = { - url = "github:comfyanonymous/ComfyUI"; - flake = false; - }; - }; - - nixConfig = { - extra-substituters = [ - "https://nix-community.cachix.org" - "https://cuda-maintainers.cachix.org" - ]; - extra-trusted-public-keys = [ - "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" - ]; - }; - - outputs = - { - self, - nixpkgs, - comfyui, - }: - { - homeManagerModules.comfyui = import ./module.nix; - - overlays.comfyui = final: _prev: { - comfyui = - let - spandrel = final.callPackage ./spandrel.nix { }; - in - final.callPackage ./default.nix { - cudaSupport = true; - inherit comfyui spandrel; - }; - }; - - packages.x86_64-linux = - let - system = "x86_64-linux"; - pkgs = import nixpkgs { - config.allowUnfree = true; - config.cudaSupport = true; - inherit system; - }; - spandrel = pkgs.callPackage ./spandrel.nix { }; - in - { - default = pkgs.callPackage ./default.nix { - inherit comfyui spandrel; - }; - }; - }; -} diff --git a/flakes/comfyui/folder_paths.patch b/flakes/comfyui/folder_paths.patch deleted file mode 100644 index 457a571..0000000 --- a/flakes/comfyui/folder_paths.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/folder_paths.py b/folder_paths.py -index 01ae821..27906ac 100644 ---- a/folder_paths.py -+++ b/folder_paths.py -@@ -11,7 +11,7 @@ supported_pt_extensions: set[str] = {'.ckpt', '.pt', '.bin', '.pth', '.safetenso - - folder_names_and_paths: dict[str, tuple[list[str], set[str]]] = {} - --base_path = os.path.dirname(os.path.realpath(__file__)) -+base_path = os.path.dirname(os.environ['COMFY_DIR']) - models_dir = os.path.join(base_path, "models") - folder_names_and_paths["checkpoints"] = ([os.path.join(models_dir, "checkpoints")], supported_pt_extensions) - folder_names_and_paths["configs"] = ([os.path.join(models_dir, "configs")], [".yaml"]) -@@ -39,10 +39,10 @@ folder_names_and_paths["photomaker"] = ([os.path.join(models_dir, "photomaker")] - - folder_names_and_paths["classifiers"] = ([os.path.join(models_dir, "classifiers")], {""}) - --output_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "output") --temp_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "temp") --input_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "input") --user_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), "user") -+output_directory = os.path.join(base_path, "output") -+temp_directory = os.path.join(base_path, "temp") -+input_directory = os.path.join(base_path, "input") -+user_directory = os.path.join(base_path, "user") - - filename_list_cache: dict[str, tuple[list[str], dict[str, float], float]] = {} - diff --git a/flakes/comfyui/module.nix b/flakes/comfyui/module.nix deleted file mode 100644 index 1c6f715..0000000 --- a/flakes/comfyui/module.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - pkgs, - lib, - config, - ... -}: -let - inherit (lib) - mkEnableOption - mkOption - types - hasSuffix - ; - cfg = config.programs.comfyui; - # comfyui only understands the path properly with a trailing slash - getStorage = if (hasSuffix "/" cfg.storage) then cfg.storage else cfg.storage + "/"; -in -{ - options.programs.comfyui = { - enable = mkEnableOption "ComfyUI"; - storage = mkOption { - type = types.path; - description = "where to source models and store information"; - }; - plugins = mkOption { - type = with types; listOf package; - description = "list of comfyui plugins"; - default = [ ]; - }; - }; - config = lib.mkIf cfg.enable { - home.packages = [ - # pkgs.comfyui - (pkgs.comfyui.override { - comfy_dir = getStorage; - inherit (cfg) plugins; - }) - ]; - home.file = builtins.listToAttrs ( - map (pkg: { - name = "${getStorage}/custom_nodes/${pkg.name}"; - value = { - recursive = true; - source = "${pkg}"; - }; - }) cfg.plugins - ); - }; -} diff --git a/flakes/comfyui/spandrel.nix b/flakes/comfyui/spandrel.nix deleted file mode 100644 index 7c7d740..0000000 --- a/flakes/comfyui/spandrel.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ - python3Packages, - fetchPypi, - ... -}: -python3Packages.buildPythonPackage rec { - pname = "spandrel"; - version = "0.4.0"; - pyproject = true; - - src = fetchPypi { - inherit pname version; - hash = "sha256-9FUmiT+SOhLvN1QsROREsSCJdlk7x8zfpU/QTHw+gMo="; - }; - - build-system = - let - inherit (python3Packages) setuptools; - in - [ - setuptools - ]; - - dependencies = - let - inherit (python3Packages) - torch - torchvision - safetensors - numpy - einops - typing-extensions - ; - in - [ - torch - torchvision - safetensors - numpy - einops - typing-extensions - ]; - - doCheck = false; -} diff --git a/flakes/niri-session-manager/flake.lock b/flakes/niri-session-manager/flake.lock deleted file mode 100644 index b5285a9..0000000 --- a/flakes/niri-session-manager/flake.lock +++ /dev/null @@ -1,41 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1749285348, - "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", - "path": "/nix/store/syvnmj3hhckkbncm94kfkbl76qsdqqj3-source", - "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", - "type": "path" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs", - "src": "src" - } - }, - "src": { - "flake": false, - "locked": { - "lastModified": 1741050520, - "narHash": "sha256-bTOxv5yZh6wgCs7ADUFKdlXGtlIckkSijGV8G7ToVy4=", - "owner": "MTeaHead", - "repo": "niri-session-manager", - "rev": "e8732380991bd629a7e6c3fb5ea50317084fb1eb", - "type": "github" - }, - "original": { - "owner": "MTeaHead", - "repo": "niri-session-manager", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flakes/niri-session-manager/flake.nix b/flakes/niri-session-manager/flake.nix deleted file mode 100644 index ee1cd01..0000000 --- a/flakes/niri-session-manager/flake.nix +++ /dev/null @@ -1,66 +0,0 @@ -{ - inputs = { - src = { - url = "github:MTeaHead/niri-session-manager"; - flake = false; - }; - }; - - outputs = - { - nixpkgs, - src, - self, - }: - { - packages.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.rustPlatform.callPackage ( - { pkgs, buildRustPackage }: - buildRustPackage (finalAttrs: { - pname = "niri-session-manager"; - version = "git-${src.rev or src.dirtyRev or "dirty"}"; - inherit src; - - cargoLock = { - lockFile = "${src}/Cargo.lock"; - }; - - meta.mainProgram = "niri-session-manager"; - }) - ) { }; - - nixosModules.niri-session-manager = - { - config, - lib, - pkgs, - ... - }: - { - options = { - services.niri-session-manager = { - enable = lib.mkEnableOption "Niri Session Manager"; - }; - }; - config = - let - cfg = config.services.niri-session-manager; - in - lib.mkIf cfg.enable { - systemd.user.services.niri-session-manager = { - enable = true; - description = "Niri Session Manager"; - wantedBy = [ "graphical-session.target" ]; - partOf = [ "graphical-session.target" ]; - wants = [ "graphical-session.target" ]; - after = [ "graphical-session.target" ]; - serviceConfig = { - Type = "simple"; - Restart = "always"; - ExecStart = "${self.packages.${pkgs.system}.default}"; - PrivateTmp = true; - }; - }; - }; - }; - }; -} diff --git a/home/bolt.nix b/home/bolt.nix deleted file mode 100644 index b9f796e..0000000 --- a/home/bolt.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ - ... -}: -{ - - imports = [ - ./home.nix - ]; - -} diff --git a/home/dots/Xresources b/home/dots/Xresources deleted file mode 100644 index af1d2c9..0000000 --- a/home/dots/Xresources +++ /dev/null @@ -1,37 +0,0 @@ - -! special -*.foreground: #d3dae3 -*.background: #181b28 -*.cursorColor: #d3dae3 - -! black -*.color0: #2f343f -*.color8: #1e2233 - -! red -*.color1: #ed244e -*.color9: #da4453 - -! green -*.color2: #27ae60 -*.color10: #71f79f - -! yellow -*.color3: #f67400 -*.color11: #fdbc4b - -! blue -*.color4: #2980b9 -*.color12: #1d99f3 - -! magenta -*.color5: #c50ed2 -*.color13: #9b59b6 - -! cyan -*.color6: #3daee9 -*.color14: #5294e2 - -! white -*.color7: #a1a9b1 -*.color15: #656a73 \ No newline at end of file diff --git a/home/dots/wlogout/style.css b/home/dots/wlogout/style.css deleted file mode 100644 index ce6b1fd..0000000 --- a/home/dots/wlogout/style.css +++ /dev/null @@ -1,48 +0,0 @@ -* { - background-image: none; -} -window { - background-color: #WINBG; -} -button { - color: #BTNCOL; - background-color: #BTNBG; - border-style: solid; - border-width: 2px; - background-repeat: no-repeat; - background-position: center; - background-size: 25%; -} - -button:focus, button:active, button:hover { - background-color: #BTNFOCUSBG; - outline-style: none; -} - -#lock { - background-image: image(url("/usr/share/wlogout/icons/lock.png"), url("/usr/local/share/wlogout/icons/lock.png")); -} - -#logout { - background-image: image(url("/usr/share/wlogout/icons/logout.png"), url("/usr/local/share/wlogout/icons/logout.png")); -} - -#suspend { - background-image: image(url("/usr/share/wlogout/icons/suspend.png"), url("/usr/local/share/wlogout/icons/suspend.png")); -} - -#hibernate { - background-image: image(url("/usr/share/wlogout/icons/hibernate.png"), url("/usr/local/share/wlogout/icons/hibernate.png")); -} - -#shutdown { - background-image: image(url("/usr/share/wlogout/icons/shutdown.png"), url("/usr/local/share/wlogout/icons/shutdown.png")); -} - -#reboot { - background-image: image(url("/usr/share/wlogout/icons/reboot.png"), url("/usr/local/share/wlogout/icons/reboot.png")); -} - -#windows { - background-image: image(url("#WINLOGO")) -} diff --git a/home/dots/zsh b/home/dots/zsh deleted file mode 100644 index 1a13aa9..0000000 --- a/home/dots/zsh +++ /dev/null @@ -1,44 +0,0 @@ -[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh - -la_culr() -{ - eza -lha --group-directories-first --icons --color=always $@ | culr -t 80 -o roygbiv-split -} - -ls_culr() -{ - eza -lh --group-directories-first --icons --color=always $@ | culr -t 80 -o roygbiv-split -} - -ps_culr() -{ - ps ww$@ | culr -t 80 -o roygbiv-split -} - -alias ...='cd ../..' -alias ....='cd ../../..' -alias .....='cd ../../../..' - -alias fresh='clear; echo; ~/.nix/header.sh' -alias icat='kitty +kitten icat' -alias chmox='chmod +x' -alias gs='git status' -alias gcl='git clone' -alias ga='git add' -alias gcb='git checkout -b' -alias gco='git checkout' -alias gl='git pull' -alias gp='git push' -alias gd='git diff' -alias gcam='git commit -am' -alias gcm='git commit -m' -alias gr='git restore' -alias gm='git merge' -alias l='ls_culr' -alias la='la_culr' -alias p='ps_culr' -alias mnt='mount | column -t | culr -t 80 -o roygbiv-split' -alias zz='z $(xplr)' -# alias kaboom='printf "type any input if you wish to update\n\npress enter to continue\n"; read upgrade; if [ -n "$upgrade" ]; then echo upgrading..; sudo nix-channel --update; else echo no upgrade!; fi; sudo nixos-rebuild switch -j9 && rm ~/.gtkrc-2.0; home-manager switch && sudo nix-collect-garbage && nix-store --optimise' -eval "$(zoxide init zsh)" -fresh diff --git a/home/home.nix b/home/home.nix deleted file mode 100644 index 0f069fd..0000000 --- a/home/home.nix +++ /dev/null @@ -1,100 +0,0 @@ -{ - inputs, - lib, - pkgs, - rice, - ... -}: -{ - home.stateVersion = "22.11"; - - imports = [ - ./modules/cli.nix - ./modules/desktop.nix - ./modules/dev.nix - ./modules/theming.nix - ./modules/niri.nix - ./util/ez.nix - ./util/name.nix - inputs.nix-index-database.hmModules.nix-index - ]; - - nix.gc = { - automatic = true; - frequency = "daily"; - options = "--delete-older-than 14d"; - }; - - xdg = { - enable = true; - portal = - let - gtk = pkgs.xdg-desktop-portal-gtk; - gnome = pkgs.xdg-desktop-portal-gnome; - in - { - enable = true; - config = { - common = { - default = [ - "gnome" - ]; - }; - }; - extraPortals = [ - gnome - gtk - ]; - }; - }; - - home.packages = - let - inherit (rice) icons fonts cursor; - in - fonts.pkgs - ++ icons.pkgs - ++ [ - cursor.package - pkgs.tauon - ]; - - systemd.user.targets.tray = { - Unit = { - Description = "Home Manager System Tray"; - Requires = [ "graphical-session.target" ]; - }; - }; - - services.syncthing = { - enable = true; - }; - - services.udiskie.enable = true; - # fix reliance on nonexistent graphical-session-pre.target - systemd.user.services.udiskie = lib.mkForce { - Unit = { - Description = "udiskie mount daemon"; - After = [ ]; - PartOf = [ "graphical-session.target" ]; - }; - - Service.ExecStart = [ "${pkgs.udiskie}/bin/udiskie --appindicator" ]; - - Install.WantedBy = [ "graphical-session.target" ]; - }; - - # programs.nix-index-database.comma.enable = true; - # programs.nix-index = { - # enable = true; - # enableZshIntegration = false; - # enableBashIntegration = false; - # }; - # programs.command-not-found.enable = false; - # programs.nix-index.enable = true; - - systemd.user.startServices = "sd-switch"; - ezServices = { - ckb-next = "${lib.getExe pkgs.ckb-next} -c -b"; - }; -} diff --git a/home/homepkgs/culr.nix b/home/homepkgs/culr.nix deleted file mode 100755 index 0dfa0a0..0000000 --- a/home/homepkgs/culr.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ - lib, - fetchFromGitea, - rustPlatform, - libX11, - pkg-config, -}: - -rustPlatform.buildRustPackage rec { - pname = "culr"; - version = "0.1.0"; - - src = fetchFromGitea { - domain = "git.atagen.co"; - owner = "atagen"; - repo = pname; - rev = "8cb1323bdc388ce1fdb0675ade756ea8b59b803d"; - sha256 = "sha256-Blo1PyhzKU4LzflmeGrvWOQEon2BCTkF3uQR+7D5/kc="; - }; - - nativeBuildInputs = [ pkg-config ]; - buildInputs = [ libX11 ]; - - cargoSha256 = "sha256-d8MshgH3EppKR80fULU5kraJzrkG57KApzcJM2muvIE="; - - meta = with lib; { - description = "colourise piped input"; - homepage = "https://git.atagen.co/atagen/culr"; - license = licenses.mit; - maintainers = [ ]; - }; - -} diff --git a/home/icons/syncthing.png b/home/icons/syncthing.png deleted file mode 100644 index cce2b8e3f8bfbef2a6950ddbe431a930a55242d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87692 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 Jmvv4FO#tp@kY)e? diff --git a/home/modules/chat.nix b/home/modules/chat.nix deleted file mode 100644 index c69e984..0000000 --- a/home/modules/chat.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ config, pkgs, ... }: -{ - imports = [ - ../util/firefox-webapp.nix - ]; - programs.firefox.webapps = { - "Microsoft-Teams" = { - url = "https://teams.microsoft.com"; - # id = 1; - extraSettings = config.programs.firefox.profiles.default.settings; - name = "Microsoft Teams"; - icon = ../icons/ms_teams.png; - }; - "Facebook-Messenger" = { - url = "https://www.messenger.com"; - # id = 2; - extraSettings = config.programs.firefox.profiles.default.settings; - name = "Facebook Messenger"; - icon = ../icons/fb_msg.png; - }; - }; - home.packages = [ pkgs.cinny-desktop ]; -} diff --git a/home/modules/cli.nix b/home/modules/cli.nix deleted file mode 100644 index 0c7b494..0000000 --- a/home/modules/cli.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ pkgs, ... }: -{ - imports = [ - ../programs/kitty.nix - # ../programs/zsh.nix - # ../programs/xresources.nix - ../programs/helix.nix - # ../programs/atuin.nix - ]; - home.packages = builtins.attrValues { - inherit (pkgs) - btop-cuda - bat - ripgrep - fd - lazygit - zoxide - zellij - ouch - ; - }; -} diff --git a/home/modules/creative.nix b/home/modules/creative.nix deleted file mode 100644 index e420aa3..0000000 --- a/home/modules/creative.nix +++ /dev/null @@ -1,10 +0,0 @@ -_: { - # imports = [ - # ../util/flatpak.nix - # ]; - # flatpaks = [ - # "ar.com.tuxguitar.TuxGuitar" - # "org.inkscape.Inkscape" - # "com.github.PintaProject.Pinta" - # ]; -} diff --git a/home/modules/desktop.nix b/home/modules/desktop.nix deleted file mode 100644 index 391a3b5..0000000 --- a/home/modules/desktop.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ pkgs, ... }: -{ - imports = [ - ./media-players.nix - ./webapps.nix - ./documents.nix - # ./creative.nix - ./chat.nix - ../programs/firefox.nix - ../programs/wlogout.nix - ../programs/bitwarden.nix - ]; - home.packages = builtins.attrValues { - inherit (pkgs) - file-roller - nautilus - thunderbird - ; - }; -} diff --git a/home/modules/documents.nix b/home/modules/documents.nix deleted file mode 100644 index c8f059d..0000000 --- a/home/modules/documents.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ pkgs, ... }: -{ - home.packages = [ - pkgs.libreoffice - ]; -} diff --git a/home/modules/niri.nix b/home/modules/niri.nix deleted file mode 100644 index 0f54082..0000000 --- a/home/modules/niri.nix +++ /dev/null @@ -1,288 +0,0 @@ -{ - pkgs, - lib, - config, - rice, - inputs, - ... -}: -let - services = - let - inherit (pkgs) swaynotificationcenter; - in - [ - swaynotificationcenter - ]; - errata = - let - inherit (pkgs) avizo playerctl; - in - [ - avizo - playerctl - ]; - extraServices = - let - inherit (pkgs) - swayidle - swaybg - systemd - avizo - ; - - inherit (inputs.niri.packages.x86_64-linux) niri-unstable; - in - [ - { - name = "swaybg"; - value = "${lib.getExe swaybg} -m fill -i ${rice.bg.src}"; - } - { - name = "avizo-service"; - value = "${lib.getExe' avizo "avizo-service"}"; - } - { - name = "swayidle"; - value = - let - niri = lib.getExe niri-unstable; - systemctl = lib.getExe' systemd "systemctl"; - in - '' - ${lib.getExe swayidle} -w \ - timeout 1800 '${systemctl} suspend' \ - timeout 600 '${niri} msg action power-off-monitors' - ''; - } - ]; -in -{ - home.packages = errata; - ezServices = builtins.listToAttrs ( - (map (entry: { - name = "${lib.strings.toLower entry.pname}"; - value = "${lib.getExe entry}"; - }) services) - ++ extraServices - ); - programs.niri.settings = - let - inherit (lib) - range - nameValuePair - mapAttrs' - mergeAttrsList - ; - inherit (builtins) listToAttrs replaceStrings; - inherit (config.lib.niri) actions; - in - { - binds = - let - hBinds = { - H = "left"; - L = "right"; - }; - vBinds = { - J = "down"; - K = "up"; - }; - makeDirBind = - mods: cmd: keys: - mapAttrs' ( - key: dir: - nameValuePair "${mods}+${key}" { - action = actions."${replaceStrings [ "$DIR" ] [ "${dir}" ] "${cmd}"}"; - } - ) keys; - makeWsBind = - mods: cmd: - listToAttrs ( - map (num: { - name = "${mods}+${builtins.toString num}"; - value = { - action."${cmd}" = num; - }; - }) (range 1 6) - ); - tagctl = lib.getExe' inputs.niri-tag.packages.${pkgs.system}.unstable "tagctl"; - makeTagBind = - mods: cmd: - listToAttrs ( - map (num: { - name = "${mods}+${builtins.toString num}"; - value = { - action.spawn = [ - tagctl - cmd - (builtins.toString num) - ]; - }; - }) (range 1 6) - ); - in - mergeAttrsList [ - { - "Mod+D".action.spawn = [ - "qs" - "ipc" - "call" - "launch" - "toggle" - ]; - "Mod+F".action.spawn = "firefox"; - "Mod+E".action.spawn = "nautilus"; - "Mod+Return".action.spawn = "kitty"; - "Mod+Shift+E".action.spawn = "wlogout"; - "Mod+Equal".action.spawn = "bitwarden"; - "Mod+Shift+Q".action = actions.close-window; - "Mod+Shift+S".action = actions.screenshot; - "Mod+R".action = actions.switch-preset-column-width; - "Mod+Shift+R".action = actions.maximize-column; - "XF86AudioRaiseVolume".action.spawn = [ - "volumectl" - "-u" - "up" - ]; - "XF86AudioLowerVolume".action.spawn = [ - "volumectl" - "-u" - "down" - ]; - "XF86AudioMute".action.spawn = [ - "volumectl" - "toggle-mute" - ]; - "XF86AudioStop".action.spawn = [ - "playerctl" - "stop" - ]; - "XF86AudioPlay".action.spawn = [ - "playerctl" - "play-pause" - ]; - "XF86AudioNext".action.spawn = [ - "playerctl" - "next" - ]; - "XF86AudioPrev".action.spawn = [ - "playerctl" - "previous" - ]; - "Mod+Space".action = actions.toggle-window-floating; - } - (makeDirBind "Mod" "focus-window-$DIR" vBinds) - (makeDirBind "Mod" "focus-column-or-monitor-$DIR" hBinds) - (makeDirBind "Mod+Shift" "move-column-$DIR-or-to-monitor-$DIR" hBinds) - (makeDirBind "Mod+Ctrl" "consume-or-expel-window-$DIR" hBinds) - (makeDirBind "Mod+Ctrl" "move-window-$DIR" vBinds) - (makeTagBind "Mod" "toggle-tag") - (makeTagBind "Mod+Shift" "toggle") - (makeTagBind "Mod+Ctrl" "exclusive-tag") - ]; - outputs = { - # "Unknown-1".enable = false; - "DP-1" = { - transform.rotation = 90; - scale = 1; - }; - "DP-2" = { - variable-refresh-rate = true; - scale = 1; - }; - }; - input = { - warp-mouse-to-focus.enable = true; - }; - cursor = { - hide-after-inactive-ms = 5000; - hide-when-typing = true; - size = 16; - theme = rice.cursor.name; - }; - layout = { - always-center-single-column = true; - gaps = 24; - default-column-width.proportion = 0.5; - preset-column-widths = map (p: { proportion = p; }) [ - (2.0 / 3.0) - 0.5 - (1.0 / 3.0) - ]; - focus-ring = - let - pal = rice.palette.hex; - in - { - active = { - color = pal.bright.yellow; - }; - inactive = { - color = pal.normal.black; - }; - }; - }; - prefer-no-csd = true; - hotkey-overlay.skip-at-startup = true; - window-rules = - let - v = 10.0; - in - [ - { - geometry-corner-radius = { - bottom-left = v; - bottom-right = 0.0; - top-left = 0.0; - top-right = v; - }; - clip-to-geometry = true; - } - ]; - }; - - # programs.ironbar = { - # enable = true; - # systemd = true; - # config = { - # monitors."DP-1" = { - # position = "top"; - # height = 16; - # start = [ - # { - # type = "music"; - # player_type = "mpris"; - # } - # ]; - # center = [ - # { - # type = "focused"; - # icon_size = 16; - # truncate = "middle"; - # } - # ]; - # end = [ - # { type = "clock"; } - # { type = "tray"; } - # ]; - # }; - # }; - # }; - - systemd.user.services.quickshell = { - Unit.PartOf = [ "graphical-session.target" ]; - Unit.After = [ - "graphical-session.target" - "niri.service" - ]; - Install.WantedBy = [ "graphical-session.target" ]; - Service = { - ExecStart = "${lib.getExe' (inputs.quickshell.packages.${pkgs.system}.default.override { - withHyprland = false; - withI3 = false; - }) "qs"}"; - }; - }; - -} diff --git a/home/modules/webapps.nix b/home/modules/webapps.nix deleted file mode 100644 index 637a7b7..0000000 --- a/home/modules/webapps.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ config, ... }: -{ - imports = [ - ../util/firefox-webapp.nix - ]; - programs.firefox.webapps = { - "Syncthing" = { - url = "http://127.0.0.1:8384"; - extraSettings = config.programs.firefox.profiles.default.settings; - name = "Syncthing"; - icon = ../icons/syncthing.png; - }; - "Open-WebUI" = { - url = "http://127.0.0.1:8088"; - extraSettings = config.programs.firefox.profiles.default.settings; - name = "Open-WebUI"; - icon = ../icons/openwebui.png; - }; - }; -} diff --git a/home/plank.nix b/home/plank.nix deleted file mode 100644 index f3004de..0000000 --- a/home/plank.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ - ... -}: -{ - imports = [ - ./home.nix - ]; - - home = { - username = "plank"; - homeDirectory = "/home/plank"; - }; -} diff --git a/home/programs/wlogout.nix b/home/programs/wlogout.nix deleted file mode 100644 index 3721963..0000000 --- a/home/programs/wlogout.nix +++ /dev/null @@ -1,71 +0,0 @@ -{ - rice, - pkgs, - ... -}: -let - pal = rice.palette.hex; -in -{ - programs.wlogout = { - enable = true; - package = pkgs.wleave; - layout = builtins.fromJSON (builtins.readFile ../dots/wlogout/layout); - style = - with pal; - (builtins.replaceStrings - [ - "/usr/share/wlogout" - "/etc/wlogout" - "#WINBG" - "#BTNCOL" - "#BTNBG" - "#BTNFOCUSBG" - "#WINLOGO" - ] - [ - "${pkgs.wlogout}/share/wlogout" - "${pkgs.wlogout}/etc/wlogout" - util.bg - bright.yellow - util.bg - normal.black - (builtins.path { - name = "winlogo"; - path = ../icons/winlogo.png; - sha256 = "7c1ff96b553c7a7ca3a7b7cf8efe830ab7feea92355aed288a10ee7347c24108"; - }) - ] - (builtins.readFile ../dots/wlogout/style.css) - ); - }; - # xdg.configFile = { - # "wleave/layout".text = builtins.readFile ../dots/wlogout/layout; - # "wleave/style.css".text = with palette-hex; (builtins.replaceStrings - # [ - # "/usr/share/wlogout" - # "/etc/wlogout" - # "#WINBG" - # "#BTNCOL" - # "#BTNBG" - # "#BTNFOCUSBG" - # "#WINLOGO" - # ] - # [ - # "${pkgs.wleave}/share/wleave" - # "${pkgs.wleave}/etc/wleave" - # util.bg - # bright.yellow - # util.bg - # normal.black - # (builtins.path { - # name = "winlogo"; - # path = ../icons/winlogo.png; - # sha256 = "7c1ff96b553c7a7ca3a7b7cf8efe830ab7feea92355aed288a10ee7347c24108"; - # }) - # ] - # (builtins.readFile ../dots/wlogout/style.css)); - # }; - - home.packages = [ pkgs.wlogout ]; -} diff --git a/home/util/name.nix b/home/util/name.nix deleted file mode 100644 index 18b1386..0000000 --- a/home/util/name.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ - mainUser, - ... -}: -{ - config.home = { - username = mainUser; - homeDirectory = "/home/${mainUser}"; - }; -} diff --git a/hosts/adrift/boot.nix b/hosts/adrift/boot.nix new file mode 100644 index 0000000..c883502 --- /dev/null +++ b/hosts/adrift/boot.nix @@ -0,0 +1,25 @@ +{ ... }: +{ + boot.kernelParams = [ + "mitigations=off" + "quiet" + "loglevel=3" + "systemd.show_status=auto" + "rd.udev.log_level=3" + "vt.global_cursor_default=0" + ]; + boot.initrd.availableKernelModules = [ + "xhci_pci" + "nvme" + "usb_storage" + "sd_mod" + "rtsx_pci_sdmmc" + ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.kernelModules = [ + "iwlwifi" + "kvm-intel" + ]; + boot.loader.systemd-boot.configurationLimit = 2; + boot.loader.efi.canTouchEfiVariables = true; +} diff --git a/hosts/adrift/fs.nix b/hosts/adrift/fs.nix new file mode 100644 index 0000000..70cf455 --- /dev/null +++ b/hosts/adrift/fs.nix @@ -0,0 +1,18 @@ +{ ... }: +{ + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/1C5C-8FF4"; + fsType = "vfat"; + }; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/26389642-cf51-4c58-98e9-1fe491a11bb9"; + fsType = "ext4"; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/a732641d-1233-45a7-8614-53caed60f11b"; } + ]; + +} diff --git a/hosts/adrift/hw.nix b/hosts/adrift/hw.nix new file mode 100644 index 0000000..3720cce --- /dev/null +++ b/hosts/adrift/hw.nix @@ -0,0 +1,5 @@ +{ lib, config, ... }: +{ + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + services.xserver.videoDrivers = [ "i915" ]; +} diff --git a/hosts/adrift/id.nix b/hosts/adrift/id.nix new file mode 100644 index 0000000..d5efea6 --- /dev/null +++ b/hosts/adrift/id.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + networking.hostName = "adrift"; # Define your hostname. + time.timeZone = "Australia/Sydney"; + time.hardwareClockInLocalTime = false; + i18n.defaultLocale = "en_AU.UTF-8"; + i18n.supportedLocales = [ "en_AU.UTF-8/UTF-8" ]; + nixpkgs.system = "x86_64-linux"; +} diff --git a/hosts/adrift/power.nix b/hosts/adrift/power.nix new file mode 100644 index 0000000..0d839be --- /dev/null +++ b/hosts/adrift/power.nix @@ -0,0 +1,6 @@ +{ lib, ... }: +{ + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + services.power-profiles-daemon.enable = false; + services.tlp.enable = true; +} diff --git a/hosts/quiver/boot.nix b/hosts/quiver/boot.nix new file mode 100644 index 0000000..1a91cc6 --- /dev/null +++ b/hosts/quiver/boot.nix @@ -0,0 +1,40 @@ +{ pkgs, ... }: +{ + boot.initrd.availableKernelModules = [ + "xhci_pci" + "ahci" + "usbcore" + "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.initrd.verbose = false; + boot.kernelModules = [ + "kvm-amd" + "i2c-dev" + ]; + boot.consoleLogLevel = 0; + boot.kernelParams = [ + "mitigations=off" + "preempt=full" + "quiet" + "loglevel=3" + "systemd.show_status=off" + "rd.udev.log_level=3" + "vt.global_cursor_default=0" + ]; + boot.supportedFilesystems = { + ntfs = true; + btrfs = true; + }; + boot.loader.efi.canTouchEfiVariables = true; + boot.plymouth = { + enable = true; + # inherit (rice.plymouth) theme themePackages font; + }; + + boot.loader.limine.extraEntries = '' + /Windows + protocol: efi + path: boot():/EFI/Microsoft/Boot/bootmgfw.efi + ''; +} diff --git a/hosts/quiver/fs.nix b/hosts/quiver/fs.nix new file mode 100644 index 0000000..2b41dbc --- /dev/null +++ b/hosts/quiver/fs.nix @@ -0,0 +1,30 @@ +{ ... }: +{ + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/b993b463-c131-4ef1-9aba-0e3eadaa2f9a"; + fsType = "btrfs"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/6B75-AF9F"; + fsType = "vfat"; + }; + + "/data" = { + device = "/dev/disk/by-uuid/39D4F78C658E8B56"; + fsType = "ntfs"; + options = [ + "rw" + "uid=1000" + "gid=100" + ]; + }; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/9c006925-e0e9-4165-bc0c-508ae2d1bfce"; } + ]; + +} diff --git a/hosts/quiver/hw.nix b/hosts/quiver/hw.nix new file mode 100644 index 0000000..3be5935 --- /dev/null +++ b/hosts/quiver/hw.nix @@ -0,0 +1,37 @@ +{ config, ... }: +{ + + security.tpm2.enable = true; + + hardware.cpu.amd.updateMicrocode = true; + services.xserver.videoDrivers = [ "nvidia" ]; + + nixpkgs.config.cudaSupport = true; + + hardware.nvidia = { + package = config.boot.kernelPackages.nvidiaPackages.latest; + modesetting.enable = true; + powerManagement.enable = true; + nvidiaPersistenced = true; + open = false; + }; + + hardware.graphics.enable = true; + hardware.graphics.enable32Bit = true; + + # openrgb no longer recognises the device? + # systemd.services.no-rgb = { + # wantedBy = ["multi-user.target"]; + # description = "rgb led turn-off-er"; + # serviceConfig = { + # Type = "oneshot"; + # ExecStart = ''${pkgs.openrgb}/bin/openrgb -d "HyperX DRAM" -m static -c 000000''; + # After = ["openrgb"]; + # }; + # }; + + # services.hardware.openrgb = { + # enable = true; + # motherboard = "amd"; + # }; +} diff --git a/system/modules/sydney.nix b/hosts/quiver/id.nix similarity index 71% rename from system/modules/sydney.nix rename to hosts/quiver/id.nix index b04dc0d..c783063 100644 --- a/system/modules/sydney.nix +++ b/hosts/quiver/id.nix @@ -1,6 +1,8 @@ _: { + networking.hostName = "quiver"; time.timeZone = "Australia/Sydney"; time.hardwareClockInLocalTime = false; i18n.defaultLocale = "en_AU.UTF-8"; i18n.supportedLocales = [ "en_AU.UTF-8/UTF-8" ]; + nixpkgs.system = "x86_64-linux"; } diff --git a/hosts/quiver/input.nix b/hosts/quiver/input.nix new file mode 100644 index 0000000..c5e6399 --- /dev/null +++ b/hosts/quiver/input.nix @@ -0,0 +1,13 @@ +{ lib, pkgs, ... }: +{ + hardware.ckb-next.enable = true; + + services.libinput.mouse = { + accelProfile = "flat"; + accelSpeed = 0.0; + }; + + hm.quickServices = { + ckb-next = "${lib.getExe pkgs.ckb-next} -c -b"; + }; +} diff --git a/hosts/quiver/llm.nix b/hosts/quiver/llm.nix new file mode 100644 index 0000000..ff90f78 --- /dev/null +++ b/hosts/quiver/llm.nix @@ -0,0 +1,20 @@ +{ inputs, config, ... }: +{ + services.ollama = { + enable = true; + user = "ollama"; + }; + + services.open-webui = { + package = inputs.nixpkgs-stable.legacyPackages.x86_64-linux.open-webui; + enable = true; + port = 8088; + environment = { + DO_NOT_TRACK = "True"; + SCARF_NO_ANALYTICS = "True"; + ANONYMIZED_TELEMETRY = "False"; + WEBUI_AUTH = "False"; + DATABASE_URL = "sqlite:///${config.services.open-webui.stateDir}/newdb.db"; + }; + }; +} diff --git a/hosts/quiver/outputs.nix b/hosts/quiver/outputs.nix new file mode 100644 index 0000000..421e9b5 --- /dev/null +++ b/hosts/quiver/outputs.nix @@ -0,0 +1,14 @@ +{ ... }: +{ + hm.programs.niri.settings.outputs = { + "DP-1" = { + transform.rotation = 90; + scale = 1; + }; + "DP-2" = { + variable-refresh-rate = true; + scale = 1; + }; + }; + +} diff --git a/hosts/quiver/stateversion.nix b/hosts/quiver/stateversion.nix new file mode 100644 index 0000000..aee74e5 --- /dev/null +++ b/hosts/quiver/stateversion.nix @@ -0,0 +1,5 @@ +{ ... }: +{ + system.stateVersion = "22.11"; + hm.home.stateVersion = "22.11"; +} diff --git a/rice/default.nix b/rice/default.nix index 2e6c4ce..57342dd 100644 --- a/rice/default.nix +++ b/rice/default.nix @@ -1,10 +1,13 @@ { + pkgs, + lib, inputs, - system, - nix-rice, }: let - pkgs = inputs.nixpkgs.legacyPackages.${system}; + nix-rice = import "${inputs.nix-rice}/lib.nix" { + inherit lib; + kitty-themes-src = { }; + }; inherit (nix-rice) kitty-themes; inherit (nix-rice.palette) toRGBShortHex toRGBHex; theme = kitty-themes.parseTheme ./pal.conf; diff --git a/system/adrift.nix b/system/adrift.nix deleted file mode 100644 index ef09b22..0000000 --- a/system/adrift.nix +++ /dev/null @@ -1,98 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -{ - imports = [ - ./configuration.nix - ]; - - nix.settings.trusted-users = [ "plank" ]; - programs.nh.flake = "/home/plank/.nix"; - - boot.kernelParams = [ - "mitigations=off" - "quiet" - "loglevel=3" - "systemd.show_status=auto" - "rd.udev.log_level=3" - "vt.global_cursor_default=0" - ]; - boot.initrd.availableKernelModules = [ - "xhci_pci" - "nvme" - "usb_storage" - "sd_mod" - "rtsx_pci_sdmmc" - ]; - boot.initrd.kernelModules = [ "dm-snapshot" ]; - boot.kernelModules = [ - "iwlwifi" - "kvm-intel" - ]; - boot.kernelPackages = pkgs.linuxPackages; - - fileSystems."/boot" = { - device = "/dev/disk/by-uuid/1C5C-8FF4"; - fsType = "vfat"; - }; - - fileSystems."/" = { - device = "/dev/disk/by-uuid/26389642-cf51-4c58-98e9-1fe491a11bb9"; - fsType = "ext4"; - }; - - swapDevices = [ - { device = "/dev/disk/by-uuid/a732641d-1233-45a7-8614-53caed60f11b"; } - ]; - - boot.loader.systemd-boot.configurationLimit = 2; - boot.loader.efi.canTouchEfiVariables = true; - # boot.plymouth.enable = true; - - networking.useDHCP = lib.mkDefault true; - hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; - powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; - services.power-profiles-daemon.enable = false; - services.tlp.enable = true; - - environment.sessionVariables = { - NIXOS_OZONE_WL = "1"; - ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=5"; - EDITOR = "hx"; - }; - - virtualisation = { - podman = { - enable = true; - dockerCompat = true; - defaultNetwork.settings.dns_enabled = true; - }; - }; - - services.xserver.videoDrivers = [ "i915" ]; - programs.xwayland.enable = true; - - xdg.portal = { - enable = true; - extraPortals = [ - pkgs.xdg-desktop-portal-gtk - ]; - }; - - environment.systemPackages = builtins.attrValues { - inherit (pkgs) - wl-clipboard - wl-clipboard-x11 - xclip - ; - }; - - networking.hostName = "adrift"; # Define your hostname. - users.users.plank = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - }; -} diff --git a/system/configuration.nix b/system/configuration.nix deleted file mode 100644 index ca8bc14..0000000 --- a/system/configuration.nix +++ /dev/null @@ -1,99 +0,0 @@ -{ - inputs, - lib, - pkgs, - mainUser, - ... -}: -{ - - imports = [ - ./modules/network.nix - ./modules/term.nix - ./modules/bootloader.nix - ./modules/sound.nix - ./modules/sydney.nix - ./modules/docs.nix - ./modules/nix-meta.nix - ./modules/anal-retentive.nix - ./modules/wm.nix - ./modules/culr.nix - ]; - - nix.gc = { - automatic = true; - dates = "daily"; - persistent = true; - options = "--delete-older-than 14d"; - }; - - services.angrr = { - enable = true; - enableNixGcIntegration = true; - period = "2weeks"; - package = inputs.angrr.packages.${pkgs.system}.default; - }; - - hardware.enableRedistributableFirmware = true; - hardware.enableAllFirmware = true; - - boot.tmp.useTmpfs = true; - - # services.udev.extraHwdb = '' - # evdev:atkbd:* - # KEYBOARD_KEY_3a=esc - # ''; - services.xserver.xkb.options = "caps:swapescape"; - # services.xserver.xkb.extraLayouts."swap" = { - # description = "caps swap"; - # languages = [ "eng" ]; - # symbolsFile = pkgs.writeText "keyboard" '' - # xkb_symbols - # { - # include "us(basic)" - - # key {[ Escape ]}; - # } - # ''; - # }; - console.useXkbConfig = true; - services.libinput.enable = true; - - hardware.graphics.enable = true; - hardware.graphics.enable32Bit = true; - - services.udisks2.enable = true; - - # services.flatpak.enable = true; - - security.polkit.enable = true; - - xdg.autostart.enable = true; - xdg.portal.enable = true; - - # services.tailscale.enable = true; - - # TODO - move these to more appropriate places - environment.systemPackages = builtins.attrValues { - inherit (pkgs) - curl - eza - git - ; - }; - - programs.nix-index-database.comma.enable = true; - programs.nix-index.enableZshIntegration = false; - programs.nix-index.enableBashIntegration = false; - - # gnome/freedesktop compat stuff - programs.dconf.enable = true; - services.gvfs.enable = true; - - # give cpuset to user - systemd.services."user@".serviceConfig.Delegate = "memory pids cpu cpuset"; - - systemd.user.extraConfig = "LogLevel=debug"; - - system.nixos.tags = [ "fatcock-xxl" ]; -} diff --git a/system/modules/anal-retentive.nix b/system/modules/anal-retentive.nix deleted file mode 100644 index cf7c868..0000000 --- a/system/modules/anal-retentive.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - pkgs, - lib, - ... -}: -{ - # perlless activations - boot.initrd.systemd.enable = true; - # breaks everything - # system.etc.overlay = { - # enable = lib.mkDefault true; - # mutable = true; - # }; - services.userborn.enable = lib.mkDefault true; - - # misc perl - system.disableInstallerTools = true; - programs.less.lessopen = null; - programs.command-not-found.enable = false; - boot.enableContainers = false; - boot.loader.grub.enable = false; - environment.defaultPackages = lib.mkDefault [ ]; - documentation.info.enable = false; - - # no cppnix .. ? - # system.systemBuilderArgs.disallowedRequisites = [pkgs.nix]; - nix.package = pkgs.lix; - system.tools.nixos-option.enable = false; -} diff --git a/system/modules/culr.nix b/system/modules/culr.nix deleted file mode 100644 index a27758c..0000000 --- a/system/modules/culr.nix +++ /dev/null @@ -1,6 +0,0 @@ -_: { - programs.culr = { - enable = true; - pattern = "rainbow-split"; - }; -} diff --git a/system/modules/network.nix b/system/modules/network.nix deleted file mode 100644 index bd64ddf..0000000 --- a/system/modules/network.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ ... }: -{ - # imports = [ - # ./mullvad.nix - # ]; - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. - systemd.services.NetworkManager-wait-online.enable = true; # for some reason nm doesn't enable without this - services.resolved = { - enable = true; - fallbackDns = [ - "103.1.206.179" - "168.138.8.38" - "168.138.12.137" - ]; - dnssec = "false"; - }; - services.mullvad-vpn.enable = true; - # systemd.services.mullvad-daemon.environment.TALPID_NET_CLS_MOUNT_DIR = "/opt/net-cls-v1"; - networking.firewall = { - checkReversePath = "loose"; - }; -} diff --git a/system/modules/nix-meta.nix b/system/modules/nix-meta.nix deleted file mode 100644 index d7a810b..0000000 --- a/system/modules/nix-meta.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ - pkgs, - lib, - inputs, - mainUser, - ... -}: -{ - # these settings propagate to home-manager's nixpkgs - nixpkgs = { - config = { - allowUnfree = true; - allowUnfreePredicate = _: true; - cudaSupport = true; - }; - }; - - nix = { - # add flake inputs to our registry to allow global use - registry = lib.mapAttrs (_: value: { flake = value; }) inputs; - settings = { - # trusted-users = ["bolt" "plank"]; - experimental-features = [ - "nix-command" - "flakes" - "pipe-operator" - ]; - substitute = true; - }; - extraOptions = '' - keep-outputs = true - keep-derivations = true - ''; - optimise.automatic = true; - # package = pkgs.lix; - }; - - # services.smooooth = { - # enable = true; - # path = "/home/${mainUser}/.nix"; - # blockers = [ - # "hx" - # { - # nix = "die"; - # } - # ]; - # nixPackage = pkgs.lix; - # }; - - programs.meat = { - enable = true; - flake = "/home/${mainUser}/.nix"; - }; - - environment.systemPackages = builtins.attrValues { - inherit (pkgs) - home-manager - cachix - nixfmt-rfc-style - ; - inherit (inputs.nil.packages.${pkgs.system}) nil; - }; -} diff --git a/system/modules/term.nix b/system/modules/term.nix deleted file mode 100644 index a2193e8..0000000 --- a/system/modules/term.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ pkgs, ... }: -let - inherit (pkgs) fish; -in -{ - programs.fish = { - enable = true; - }; - programs.zoxide = { - enable = true; - enableFishIntegration = true; - }; - environment.systemPackages = [ - fish - ]; - environment.shells = [ fish ]; - users.defaultUserShell = fish; - console = { - font = "Lat2-Terminus16"; - }; -} diff --git a/system/modules/wm.nix b/system/modules/wm.nix deleted file mode 100644 index 63486a8..0000000 --- a/system/modules/wm.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ - pkgs, - mainUser, - inputs, - ... -}: -{ - services.greetd = { - enable = true; - restart = false; - settings = - let - session = { - command = "niri-session"; - user = "${mainUser}"; - }; - in - { - default_session = session; - initial_session = session; - }; - }; - programs.niri = { - enable = true; - package = inputs.niri.packages.${pkgs.system}.niri-unstable; - }; - services.niri-tag.enable = true; -} diff --git a/system/quiver.nix b/system/quiver.nix deleted file mode 100644 index 2729271..0000000 --- a/system/quiver.nix +++ /dev/null @@ -1,207 +0,0 @@ -{ - config, - lib, - pkgs, - inputs, - rice, - ... -}: -{ - imports = [ - ./configuration.nix - ]; - - environment = { - arbys.enable = true; - files = { - }; - }; - - services.ollama = { - enable = true; - user = "ollama"; - }; - - system.stateVersion = "22.11"; # Did you read the comment? - - networking.hostName = "quiver"; - - users.users.bolt = { - isNormalUser = true; - extraGroups = [ - "wheel" - "podman" - ]; - }; - - boot.initrd.availableKernelModules = [ - "xhci_pci" - "ahci" - "usbcore" - "sd_mod" - ]; - boot.initrd.kernelModules = [ ]; - boot.initrd.verbose = false; - boot.kernelModules = [ - "kvm-amd" - "i2c-dev" - ]; - boot.consoleLogLevel = 0; - boot.kernelParams = [ - "mitigations=off" - "preempt=full" - "quiet" - "loglevel=3" - "systemd.show_status=off" - "rd.udev.log_level=3" - "vt.global_cursor_default=0" - ]; - - services.scx = { - enable = true; - scheduler = "scx_bpfland"; - }; - boot.kernelPackages = pkgs.linuxPackages_cachyos; - boot.supportedFilesystems = { - ntfs = true; - btrfs = true; - }; - - boot.loader.efi.canTouchEfiVariables = true; - - boot.plymouth = { - enable = true; - # inherit (rice.plymouth) theme themePackages font; - }; - - security.tpm2.enable = true; - - networking.useDHCP = lib.mkDefault true; - - hardware.cpu.amd.updateMicrocode = true; - - environment.pathsToLink = [ - "/share/xdg-desktop-portal" - "/share/applications" - ]; - environment.sessionVariables = { - NIXOS_OZONE_WL = "1"; - # ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=5"; - GBM_BACKEND = "nvidia-drm"; - NVD_BACKEND = "direct"; - __GLX_VENDOR_LIBRARY_NAME = "nvidia"; - LIBVA_DRIVER_NAME = "nvidia"; - __GL_GSYNC_ALLOWED = "1"; - __GL_VRR_ALLOWED = "1"; - EDITOR = "hx"; - }; - - nix.settings.trusted-users = [ "bolt" ]; - - virtualisation.oci-containers.backend = "podman"; - hardware.nvidia-container-toolkit.enable = true; - virtualisation = { - podman = { - enable = true; - dockerSocket.enable = true; - defaultNetwork.settings.dns_enabled = true; - }; - }; - - services.xserver.videoDrivers = [ "nvidia" ]; - hardware.nvidia = { - package = config.boot.kernelPackages.nvidiaPackages.latest; - modesetting.enable = true; - powerManagement.enable = true; - nvidiaPersistenced = true; - open = false; - }; - programs.xwayland.enable = true; - - # openrgb no longer recognises the device? - # systemd.services.no-rgb = { - # wantedBy = ["multi-user.target"]; - # description = "rgb led turn-off-er"; - # serviceConfig = { - # Type = "oneshot"; - # ExecStart = ''${pkgs.openrgb}/bin/openrgb -d "HyperX DRAM" -m static -c 000000''; - # After = ["openrgb"]; - # }; - # }; - - # services.hardware.openrgb = { - # enable = true; - # motherboard = "amd"; - # }; - - hardware.ckb-next.enable = true; - environment.systemPackages = - builtins.attrValues { - inherit (pkgs) - wl-clipboard - wl-clipboard-x11 - xclip - ; - inherit (pkgs.kdePackages) qtbase qtdeclarative; - } - ++ [ - (inputs.quickshell.packages.${pkgs.system}.default.override { - withHyprland = false; - withI3 = false; - }) - ]; - programs.fuse.userAllowOther = true; - services.libinput.mouse = { - accelProfile = "flat"; - accelSpeed = 0.0; - }; - - fileSystems = { - "/" = { - device = "/dev/disk/by-uuid/b993b463-c131-4ef1-9aba-0e3eadaa2f9a"; - fsType = "btrfs"; - }; - - "/boot" = { - device = "/dev/disk/by-uuid/6B75-AF9F"; - fsType = "vfat"; - }; - - "/data" = { - device = "/dev/disk/by-uuid/39D4F78C658E8B56"; - fsType = "ntfs"; - options = [ - "rw" - "uid=1000" - "gid=100" - ]; - }; - }; - - swapDevices = [ - { device = "/dev/disk/by-uuid/9c006925-e0e9-4165-bc0c-508ae2d1bfce"; } - ]; - - # networking.nftables.enable = true; - networking.firewall = { - # allowedUDPPorts = [1900]; - # allowedTCPPorts = [8200 2234]; - allowedTCPPorts = [ 2234 ]; - }; - - services.open-webui = { - package = inputs.nixpkgs-stable.legacyPackages.x86_64-linux.open-webui; - enable = true; - port = 8088; - environment = { - DO_NOT_TRACK = "True"; - SCARF_NO_ANALYTICS = "True"; - ANONYMIZED_TELEMETRY = "False"; - WEBUI_AUTH = "False"; - DATABASE_URL = "sqlite:///${config.services.open-webui.stateDir}/newdb.db"; - }; - }; - - # for quickshell - qt.enable = true; -} diff --git a/system/servers/atagen-vps/reflector.nix b/system/servers/atagen-vps/reflector.nix deleted file mode 100644 index 585c07d..0000000 --- a/system/servers/atagen-vps/reflector.nix +++ /dev/null @@ -1,361 +0,0 @@ -# Edit this configuration file to define what should be installed on -# your system. Help is available in the configuration.nix(5) man page -# and in the NixOS manual (accessible by running ‘nixos-help’). -{ - config, - pkgs, - ... -}: -let - wekan-compose = pkgs.fetchurl { - url = "https://github.com/wekan/wekan/raw/v6.68/docker-compose.yml"; - sha256 = "sha256-gLZ8bZZ8ZMo1NGz3ooIgXRH6JuMoEMp+to7lfqAvc6E="; - }; - # wekan-private = pkgs.runCommand "wekan-private" {} '' - # cp ${wekan-compose} $out - # sed -i '/localtime/d' $out - # sed -i '/timezone/d' $out - # sed -i 's/80:8080/7897:8080/g' $out - # sed -i 's/ROOT_URL=.*/ROOT_URL=https:\/\/reflector\.beam\/kanban\//' $out - # ''; - wekan-rhizome = pkgs.runCommand "wekan-rhizome" { } '' - cp ${wekan-compose} $out - sed -i '/localtime/d' $out - sed -i '/timezone/d' $out - sed -i 's/80:8080/7897:8080/g' $out - sed -i 's/ROOT_URL=.*/ROOT_URL=https:\/\/board\.rhizome\.tf\//' $out - ''; -in -{ - imports = [ - # Include the results of the hardware scan. - ./hardware-configuration.nix - # ./cachix.nix - # (import (builtins.fetchTarball "https://github.com/jonascarpay/declarative-cachix/archive/master.tar.gz")) - ]; - - # cachix = [ - # "nix-community" - # ]; - - nix.settings.experimental-features = [ - "flakes" - "nix-command" - ]; - # systemd.services.NetworkManager-wait-online.enable = false; - - # Use the GRUB 2 boot loader. - boot.loader.grub.enable = true; - boot.loader.grub.version = 2; - boot.loader.grub.device = "/dev/vda"; # or "nodev" for efi only - - networking.hostName = "reflector"; # Define your hostname. - networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. - - # Set your time zone. - time.timeZone = "Australia/Sydney"; - - # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.sunshine = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - packages = with pkgs; [ ]; - openssh.authorizedKeys.keys = [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSQC8VgKLzoU5BSynJJuC8BFqAEN8JlSIzsZ2Vg9rfXHM7T4vbWtnxSCSbNw3CEnZCfrdDQTeRum7Uq+gvrcHWd9Aj+rVmubTdud70ybW7T7SlGv3b5TYBhMNbrAz0JIJjLnFMy3/pWids1v6mKW3i7k6Kbq8fSt7jva5Yg5x1jtkUUwvjSZjPg/E/Zl0hAcnx8fWe4foFTcYYsUbfEpp6bxdN2QuVmb17UKnLrMz6JTj88Jd2uYZkeKxGOwk+uwrd0WArY8JIiRi1NcPA3I42aAQfZKxCUY/xmVyRlF+l6K8caD4CZlysms9aXQzBhmPPDIY87AwyRlVK5JsRbaMEBMsffX2xk8DdV+2+9RbztgeXOoYk7WjJX1/+WcxY3RGn8QsUfrGALmrQTRGXgYRbtM/ZJq1m9aP6IvVQeKE1NOpKguXpmokB7JsyKPcWk/PCMVYyXM/qYspc6hRPJgGWiJsayj7myO6X5Ssl9uQnHpNNyrQNY+cx3/boBu2J1sM= bolt@quiver" - ]; - }; - - nixpkgs.config.allowUnfree = true; - - # List packages installed in system profile. To search, run: - # $ nix search wget - environment.systemPackages = with pkgs; [ - helix - ripgrep - fd - curl - - cachix - headscale - - comma - - woodpecker-agent - woodpecker-server - - # podman - # podman-compose - # shadow - - dufs - ]; - - virtualisation = { - docker.enable = true; - # podman = { - # enable = true; - # dockerCompat = true; - # defaultNetwork.dnsname.enable = true; - # }; - }; - - # services.resolved = { - # enable = true; - # fallbackDns = [ "103.1.206.179" "168.138.8.38" "168.138.12.137" ]; - # dnssec = "false"; - # }; - - services.fail2ban.enable = true; - - services.tailscale.enable = true; - - services.headscale = { - enable = true; - serverUrl = "https://net.atagen.co"; - dns = { - nameservers = [ - "103.1.206.179" - "168.138.8.38" - "168.138.12.137" - ]; - magicDns = true; - }; - }; - - services.syncthing = { - enable = true; - extraOptions = { - gui = { - insecureSkipHostcheck = true; - }; - }; - }; - - services.gitea = { - enable = true; - appName = "atagen gitea"; - domain = "git.atagen.co"; - httpPort = 3033; - settings.server = { - START_SSH_SERVER = true; - SSH_PORT = 6660; - SSH_DOMAIN = "git.atagen.co"; - DISABLE_SSH = false; - }; - rootUrl = "https://git.atagen.co"; - settings.service.DISABLE_REGISTRATION = true; - settings.webhook.ALLOWED_HOST_LIST = "external,loopback"; - }; - - users.users.ci = { - isSystemUser = true; - createHome = true; - group = "ci"; - extraGroups = [ - "docker" - "wheel" - ]; - }; - users.groups.ci = { }; - - users.users.ci-agent = { - isSystemUser = true; - createHome = true; - group = "ci"; - extraGroups = [ - "docker" - "wheel" - ]; - }; - users.groups.ci = { }; - - users.users.dufs = { - isSystemUser = true; - createHome = true; - group = "dufs"; - }; - users.groups.dufs = { }; - - systemd.services.woodpecker-server = { - wantedBy = [ "multi-user.target" ]; - description = "woodpecker CI/CD server"; - serviceConfig = { - Environment = [ - "WOODPECKER_OPEN=true" - "WOODPECKER_ADMIN=atagen" - "WOODPECKER_REPO_OWNERS=rhizome" - "WOODPECKER_HOST=https://ci.atagen.co" - "WOODPECKER_GITEA=true" - "WOODPECKER_GITEA_URL=https://git.atagen.co" - "WOODPECKER_GITEA_CLIENT=1418f1d9-e2ce-4e8f-b8b2-7cf714baa07e" - "WOODPECKER_GITEA_SECRET=gto_chpk65trvfbnrqs4cog62kn7sgmvpizg5wbr4zknb54o4gxlssba" - "WOODPECKER_GITEA_SKIP_VERIFY=true" - "WOODPECKER_AGENT_SECRET=71a0ac7d617aef46fb93811c6e2a300e041a324727df12b4805d5f4e9e1f3326" - "WOODPECKER_DATABASE_DATASOURCE=/var/lib/woodpecker/woodpecker.sqlite" - ]; - Restart = "always"; - ExecStart = "${pkgs.woodpecker-server}/bin/woodpecker-server"; - User = "ci"; - Group = "ci"; - }; - }; - - systemd.services.woodpecker-agent = { - wantedBy = [ "multi-user.target" ]; - description = "woodpecker CI/CD agent"; - serviceConfig = { - Environment = [ - "WOODPECKER_SERVER=localhost:9000" - "WOODPECKER_AGENT_SECRET=71a0ac7d617aef46fb93811c6e2a300e041a324727df12b4805d5f4e9e1f3326" - ]; - Restart = "always"; - ExecStart = "${pkgs.woodpecker-agent}/bin/woodpecker-agent"; - User = "ci-agent"; - }; - }; - - # systemd.services.wekan-private = { - # wantedBy = [ "multi-user.target" ]; - # after = [ "network.target" "docker.service" ]; - # requires = [ "docker.service" ]; - # description = "wekan kanban board"; - # serviceConfig = { - # Restart = "always"; - # User = "root"; - # ExecStart = "${pkgs.docker}/bin/docker compose -f ${wekan-private} up"; - # ExecStop = "${pkgs.docker}/bin/docker compose -f ${wekan-private} down"; - # }; - # }; - - systemd.services.wekan-rhizome = { - wantedBy = [ "multi-user.target" ]; - after = [ - "network.target" - "docker.service" - ]; - requires = [ "docker.service" ]; - description = "wekan kanban board for rhizomers"; - serviceConfig = { - Restart = "always"; - User = "root"; - ExecStart = "${pkgs.docker}/bin/docker compose -f ${wekan-rhizome} up"; - ExecStop = "${pkgs.docker}/bin/docker compose -f ${wekan-rhizome} down"; - }; - }; - - systemd.services.dufs = { - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - description = "dufs webdav server"; - serviceConfig = { - User = "dufs"; - Restart = "always"; - ExecStart = "${pkgs.dufs}/bin/dufs -b 127.0.0.1 -p 8083 /home/dufs/files"; - }; - }; - - # systemd.services.foswiki = { - # wantedBy = [ "multi-user.target" ]; - # after = [ "network.target" "docker.service" ]; - # requires = [ "docker.service" ]; - # description = "foswiki wiki site"; - # serviceConfig = { - # Restart = "always"; - # User = "root"; - # ExecStart = "${pkgs.docker}/bin/docker compose -f ${foswiki-compose} up"; - # ExecStop = "${pkgs.docker}/bin/docker compose -f ${foswiki-compose} down"; - # }; - # }; - - services.caddy = { - enable = true; - virtualHosts = { - "atagen.co" = { - serverAliases = [ "www.atagen.co" ]; - extraConfig = '' - respond "i live.. again" - ''; - }; - - "iced-rs.info".extraConfig = '' - reverse_proxy http://127.0.0.1:8765 - ''; - - "ci.atagen.co".extraConfig = '' - reverse_proxy http://127.0.0.1:8000 - ''; - - # "ci.rhizome.tf".extraConfig = '' - # reverse_proxy http://127.0.0.1:8000 - # ''; - - "git.atagen.co".extraConfig = '' - reverse_proxy http://127.0.0.1:3033 - ''; - - # "git.rhizome.tf".extraConfig = '' - # reverse_proxy http://127.0.0.1:3033 - # ''; - - "board.rhizome.tf".extraConfig = '' - reverse_proxy http://127.0.0.1:7897 - ''; - - "net.atagen.co".extraConfig = '' - reverse_proxy http://127.0.0.1:8080 - ''; - - "reflector.beam".extraConfig = '' - tls /etc/selfsigned/cert.pem /etc/selfsigned/key.pem - - route /sync/* { - uri strip_prefix /sync - reverse_proxy http://127.0.0.1:8384 - } - - route /philez/* { - uri strip_prefix /philez - reverse_proxy http://127.0.0.1:8083 - } - ''; - }; - }; - - # Enable the OpenSSH daemon. - services.openssh = { - enable = true; - passwordAuthentication = false; - kbdInteractiveAuthentication = false; - permitRootLogin = "no"; - }; - - networking.firewall = { - enable = true; - trustedInterfaces = [ "tailscale0" ]; - checkReversePath = "loose"; - allowedTCPPorts = [ - 80 - 443 - 6660 - ]; - allowedUDPPorts = [ - 80 - 443 - 41641 - 6660 - ]; - }; - - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - system.copySystemConfiguration = true; - - # This value determines the NixOS release from which the default - # settings for stateful data, like file locations and database versions - # on your system were taken. It‘s perfectly fine and recommended to leave - # this value at the release version of the first install of this system. - # Before changing this value read the documentation for this option - # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). - system.stateVersion = "22.11"; # Did you read the comment? -} diff --git a/system/servers/rhizome-vps/configuration.nix b/system/servers/rhizome-vps/configuration.nix deleted file mode 100644 index 7c65bf0..0000000 --- a/system/servers/rhizome-vps/configuration.nix +++ /dev/null @@ -1,295 +0,0 @@ -# Edit this configuration file to define what should be installed on -# your system. Help is available in the configuration.nix(5) man page -# and in the NixOS manual (accessible by running `nixos-help`). -{ - pkgs, - lib, - ... -}: -{ - imports = [ - # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; - - nix.settings.experimental-features = [ - "nix-command" - "flakes" - ]; - nix.extraOptions = '' - keep-outputs = true - keep-derivations = true - ''; - - environment.pathsToLink = [ "/share/zsh" ]; - programs.zsh.enable = true; - users.defaultUserShell = pkgs.zsh; - - users.users.felix = { - isSystemUser = true; - group = "www"; - extraGroups = [ "docker" ]; - }; - - users.users.spore = { - isSystemUser = true; - home = "/home/spore"; - createHome = true; - useDefaultShell = true; - group = "www"; - extraGroups = [ "docker" ]; - openssh.authorizedKeys.keys = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL9VRcCnmjCyV7DpCm8ir3+xPTbyMDBJhgSkhpmdFL5d spore@server.rhizome.tf" - ]; - }; - - users.groups.www = { - members = [ - "acme" - "felix" - "spore" - ]; - }; - - boot.loader.grub.enable = true; - boot.loader.grub.device = "/dev/vda"; # or "nodev" for efi only - - networking.hostName = "filament"; # Define your hostname. - time.timeZone = "Australia/Sydney"; - - i18n.defaultLocale = "en_AU.UTF-8"; - - users.users.rhizome = { - isNormalUser = true; - extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - openssh.authorizedKeys.keys = [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSQC8VgKLzoU5BSynJJuC8BFqAEN8JlSIzsZ2Vg9rfXHM7T4vbWtnxSCSbNw3CEnZCfrdDQTeRum7Uq+gvrcHWd9Aj+rVmubTdud70ybW7T7SlGv3b5TYBhMNbrAz0JIJjLnFMy3/pWids1v6mKW3i7k6Kbq8fSt7jva5Yg5x1jtkUUwvjSZjPg/E/Zl0hAcnx8fWe4foFTcYYsUbfEpp6bxdN2QuVmb17UKnLrMz6JTj88Jd2uYZkeKxGOwk+uwrd0WArY8JIiRi1NcPA3I42aAQfZKxCUY/xmVyRlF+l6K8caD4CZlysms9aXQzBhmPPDIY87AwyRlVK5JsRbaMEBMsffX2xk8DdV+2+9RbztgeXOoYk7WjJX1/+WcxY3RGn8QsUfrGALmrQTRGXgYRbtM/ZJq1m9aP6IvVQeKE1NOpKguXpmokB7JsyKPcWk/PCMVYyXM/qYspc6hRPJgGWiJsayj7myO6X5Ssl9uQnHpNNyrQNY+cx3/boBu2J1sM= bolt@quiver" - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDW/YjnlHiEf2bV0RapVl+jWEtsNYrbXsaJJhXUkAaf61rsTZ2jpda7FmOVGjyJiOkTNYANoT83YhGxvKt3Ukcx5xG0JhcrilEGKfOR43/QLlXetCh4aFed//CXYNQo8obDovx9A8YamzfZWJo0nhshEAt1aDvNGlyPgHZI3r5vYNB6OpMlaSnr873i5hp6S9dxURoF0FjpdZwTWk5DiYUoZCezs6TfG6PzHbSsB88o4AUNZ6O+h1KD0lITSXH/v/M1zG8fkUzfZHFQoZ6VaIMhIVwLmbybvyb630IIfhx6KUoCWzCRlKBjVOGsQ1xZWEnjPgHB6atX5eNc/L8/bdyZOJ4aE2wSdVNMyriYuiyc3t/RwSvcRpfmzaxWUImDpjH3mxCrDymrZIQQTrNuC6o5O3mz3NCZRcFUZmuZXeYphyrzuNgAfsvHKMd8Fu+PdddSPCHkgYEIRuGD4flaujM8eUHZYqKkpmmiMwKk6jupBscN+1uwBqGQbaR0InXR+4c= custard" - ]; - }; - - users.users.ci = { - isSystemUser = true; - createHome = true; - group = "ci"; - extraGroups = [ "docker" ]; - }; - - users.users.ci-agent = { - isSystemUser = true; - createHome = true; - group = "ci"; - extraGroups = [ "docker" ]; - }; - - users.groups.ci = { }; - - virtualisation = { - docker.enable = true; - # podman = { - # enable = true; - # dockerCompat = true; - # defaultNetwork.settings.dns_enabled = true; - # }; - }; - - services.fail2ban.enable = true; - - services.redis.servers."".enable = true; - - services.gitea = { - enable = true; - appName = "rhizome gitea"; - domain = "git.rhizome.tf"; - httpPort = 3036; - settings.server = { - START_SSH_SERVER = true; - SSH_PORT = 6660; - SSH_DOMAIN = "git.rhizome.tf"; - DISABLE_SSH = false; - }; - rootUrl = "https://git.rhizome.tf"; - settings.service.DISABLE_REGISTRATION = true; - settings.webhook.ALLOWED_HOST_LIST = "external,loopback"; - }; - - # systemd.services.spore = { - # wantedBy = [ "multi-user.target" ]; - # description = "Spore Deployment Tool"; - # serviceConfig = { - # User = "spore"; - # Restart = "on-failure"; - # ExecStart = "${lib.getExe pkgs.spore}"; - - # }; - # }; - - systemd.services.grab-keys = { - description = "Server Key Grabber"; - serviceConfig = { - Type = "oneshot"; - User = "spore"; - Restart = "on-failure"; - ExecStart = "${pkgs.openssh}/bin/scp spore@server.rhizome.tf:/etc/letsencrypt/live/server.rhizome.tf/cert.pem /var/www/server.pem"; - }; - }; - - systemd.timers.grab-keys = { - description = "Server Key Grabber"; - timerConfig = { - Persistent = "yes"; - OnCalendar = "daily"; - Unit = "grab-keys.service"; - }; - }; - - systemd.services.woodpecker-server = { - wantedBy = [ "multi-user.target" ]; - description = "woodpecker CI/CD server"; - serviceConfig = { - Environment = [ - "WOODPECKER_OPEN=true" - "WOODPECKER_ADMIN=dbx" - "WOODPECKER_REPO_OWNERS=rhizome" - "WOODPECKER_HOST=https://ci.rhizome.tf" - "WOODPECKER_GITEA=true" - "WOODPECKER_GITEA_URL=https://git.rhizome.tf" - "WOODPECKER_GITEA_CLIENT=86bb265b-8914-4abd-a3eb-f843fabbd79d" - "WOODPECKER_GITEA_SECRET=gto_474i24aku3vda6wjbumdgfdcjdllclecfplfb4wsz2ibkemhdrwq" - "WOODPECKER_GITEA_SKIP_VERIFY=true" - "WOODPECKER_AGENT_SECRET=71a0ac7d617aef46fb93811c6e2a300e041a324727df12b4805d5f4e9e1f3326" - "WOODPECKER_DATABASE_DATASOURCE=/var/lib/woodpecker/woodpecker.sqlite" - ]; - Restart = "on-failure"; - ExecStart = "${lib.getExe pkgs.woodpecker-server}"; - User = "ci"; - Group = "ci"; - }; - }; - - systemd.services.woodpecker-agent = { - wantedBy = [ "multi-user.target" ]; - description = "woodpecker CI/CD agent"; - serviceConfig = { - Environment = [ - "WOODPECKER_AGENT_SECRET=71a0ac7d617aef46fb93811c6e2a300e041a324727df12b4805d5f4e9e1f3326" - ]; - Restart = "always"; - ExecStart = "${lib.getExe pkgs.woodpecker-agent}"; - User = "ci-agent"; - Group = "ci"; - }; - }; - - systemd.services.felix = { - wantedBy = [ "multi-user.target" ]; - description = "gilles on testing"; - serviceConfig = { - ExecStart = ''${lib.getExe pkgs.docker} run --network host -v /var/lib/acme/rhizome.tf:/var/lib/acme/rhizome.tf --env-file /var/www/felix_env git.rhizome.tf/rhizome/gilles:latest''; - Group = "www"; - User = "felix"; - Restart = "always"; - }; - }; - - services.caddy = { - enable = true; - virtualHosts = { - "rhizome.tf".extraConfig = '' - route /.well-known/acme-challenge/* { - root * /var/www/acme-challenge - file_server - } - root * /var/www/rhizome.tf - file_server - handle_errors { - @404 { - expression {http.error.status_code} == 404 - } - rewrite @404 /404.html - file_server - } - ''; - "git.rhizome.tf".extraConfig = '' - reverse_proxy http://localhost:3036 - ''; - "ci.rhizome.tf".extraConfig = '' - reverse_proxy http://localhost:8000 - ''; - }; - group = "www"; - }; - - # List packages installed in system profile. To search, run: - # $ nix search wget - environment.systemPackages = with pkgs; [ - kitty - helix - ripgrep - fd - exa - bat - nix-index - comma - alejandra - curl - cachix - git - man-pages - man-pages-posix - rnix-lsp - zellij - zoxide - fzf - btop - ]; - documentation.dev.enable = true; - documentation.man.enable = true; - documentation.enable = true; - programs.nix-index-database.comma.enable = true; - programs.nix-index.enableZshIntegration = false; - programs.nix-index.enableBashIntegration = false; - - services.openssh = { - enable = true; - passwordAuthentication = false; - kbdInteractiveAuthentication = false; - permitRootLogin = "no"; - }; - - networking.firewall.allowedTCPPorts = [ - 22 - 80 - 443 - 5539 - 5559 - 6660 - ]; - networking.firewall.allowedUDPPorts = [ - 443 - 6660 - ]; - - security.acme = { - acceptTerms = true; - defaults.email = "admin@rhizome.tf"; - defaults.group = "www"; - certs."rhizome.tf" = { - webroot = "/var/www/acme-challenge"; - }; - }; - - # This value determines the NixOS release from which the default - # settings for stateful data, like file locations and database versions - # on your system were taken. It's perfectly fine and recommended to leave - # this value at the release version of the first install of this system. - # Before changing this value read the documentation for this option - # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). - system.stateVersion = "23.05"; # Did you read the comment? - - system.activationScripts = { - acls.text = '' - ${pkgs.acl}/bin/setfacl -Rm spore:rx /var/lib/acme/rhizome.tf - ''; - }; -} diff --git a/system/servers/rhizome-vps/flake.nix b/system/servers/rhizome-vps/flake.nix deleted file mode 100644 index 677b59a..0000000 --- a/system/servers/rhizome-vps/flake.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ - description = "rhizome dev server"; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05"; - - flake-parts = { - url = "github:hercules-ci/flake-parts"; - inputs.nixpkgs-lib.follows = "nixpkgs"; - }; - - flake-utils.url = "github:numtide/flake-utils"; - - home-manager = { - url = "github:nix-community/home-manager/release-23.05"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - nix-index-database = { - url = "github:Mic92/nix-index-database"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; - - outputs = - { - self, - nixpkgs, - home-manager, - nix-index-database, - ... - }@inputs: - let - inherit (self) outputs; - in - rec { - nixosConfigurations = { - "filament" = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - specialArgs = { inherit inputs outputs; }; - modules = [ - ./configuration.nix - nix-index-database.nixosModules.nix-index - home-manager.nixosModules.home-manager - { - home-manager.useGlobalPkgs = true; - home-manager.extraSpecialArgs = { inherit inputs outputs; }; - home-manager.users.rhizome.imports = [ ./rhizome.nix ]; - } # hm - ]; # modules - }; # filament - }; - }; # rec -} diff --git a/system/servers/rhizome-vps/hardware-configuration.nix b/system/servers/rhizome-vps/hardware-configuration.nix deleted file mode 100644 index 7564564..0000000 --- a/system/servers/rhizome-vps/hardware-configuration.nix +++ /dev/null @@ -1,38 +0,0 @@ -# Do not modify this file! It was generated by ‘nixos-generate-config’ -# and may be overwritten by future invocations. Please make changes -# to /etc/nixos/configuration.nix instead. -{ - lib, - ... -}: -{ - imports = [ ]; - - boot.initrd.availableKernelModules = [ - "ata_piix" - "uhci_hcd" - "virtio_pci" - "sr_mod" - "virtio_blk" - ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ ]; - boot.extraModulePackages = [ ]; - - fileSystems."/" = { - device = "/dev/disk/by-uuid/f4889546-f71c-4e3c-ab47-e183a72dc52e"; - fsType = "ext4"; - }; - - swapDevices = [ ]; - - # Enables DHCP on each ethernet and wireless interface. In case of scripted networking - # (the default) this is the recommended approach. When using systemd-networkd it's - # still possible to use this option, but it's recommended to use it in conjunction - # with explicit per-interface declarations with `networking.interfaces..useDHCP`. - networking.useDHCP = lib.mkDefault true; - # networking.interfaces.ens3.useDHCP = lib.mkDefault true; - - nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - virtualisation.hypervGuest.enable = true; -} diff --git a/system/servers/rhizome-vps/rhizome.nix b/system/servers/rhizome-vps/rhizome.nix deleted file mode 100644 index 72acd99..0000000 --- a/system/servers/rhizome-vps/rhizome.nix +++ /dev/null @@ -1,127 +0,0 @@ -{ - pkgs, - ... -}: -{ - home.packages = with pkgs; [ - lazygit - alejandra - ]; - - home = { - username = "rhizome"; - homeDirectory = "/home/rhizome"; - }; - - programs.direnv = { - enable = true; - nix-direnv = { - enable = true; - }; - }; - - programs.git = { - enable = true; - userName = "rhizome"; - userEmail = "filament@rhizome.tf"; - }; - - programs.fzf = { - enable = true; - enableZshIntegration = true; - }; - - programs.helix = { - enable = true; - settings = { - theme = "base16_terminal"; - editor.lsp.display-messages = true; - }; - }; - - programs.zsh = { - enable = true; - enableAutosuggestions = true; - enableCompletion = true; - enableSyntaxHighlighting = true; - enableVteIntegration = true; - autocd = true; - defaultKeymap = "viins"; - initExtra = '' - [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh - alias ...='cd ../..' - alias ....='cd ../../..' - alias .....='cd ../../../..' - alias chmox='chmod +x' - alias gs='git status' - alias gcl='git clone' - alias ga='git add' - alias gcb='git checkout -b' - alias gco='git checkout' - alias gl='git pull' - alias gp='git push' - alias gd='git diff' - alias gcam='git commit -am' - alias gcm='git commit -m' - alias gr='git restore' - alias gm='git merge' - alias l='exa -lh --group-directories-first --icons --color=always' - alias la='exa -lha --group-directories-first --icons --color=always' - eval "$(zoxide init zsh)" - ''; - plugins = [ - { - name = "powerlevel10k"; - src = pkgs.zsh-powerlevel10k; - file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; - } - { - name = "zsh-vi-mode"; - src = pkgs.zsh-vi-mode; - file = "share/zsh-vi-mode/zsh-vi-mode.zsh"; - } - { - name = "zsh-autopair"; - src = pkgs.zsh-autopair; - file = "share/zsh-autopair/zsh-autopair.zsh"; - } - { - name = "zsh-completions"; - src = pkgs.zsh-completions; - file = "share/zsh-completions/zsh-completions.zsh"; - } - { - name = "zsh-command-time"; - src = pkgs.zsh-command-time; - file = "share/zsh-completions/zsh-command-time.zsh"; - } - { - name = "zsh-autocomplete"; - src = pkgs.zsh-autocomplete; - file = "share/zsh-autocomplete/zsh-autocomplete.zsh"; - } - { - name = "zsh-fast-syntax-highlighting"; - src = pkgs.zsh-fast-syntax-highlighting; - file = "share/zsh-fast-syntax-highlighting/zsh-fast-syntax-highlighting.zsh"; - } - { - name = "zsh-nix-shell"; - src = pkgs.zsh-nix-shell; - file = "share/zsh-nix-shell/zsh-nix-shell.zsh"; - } - { - name = "any-nix-shell"; - src = pkgs.any-nix-shell; - file = "share/any-nix-shell/any-nix-shell.zsh"; - } - { - name = "nix-zsh-completions"; - src = pkgs.nix-zsh-completions; - file = "share/nix-zsh-completions/nix-zsh-completions.zsh"; - } - ]; - }; - - home.stateVersion = "23.05"; -} diff --git a/util/create.nix b/util/create.nix new file mode 100644 index 0000000..a17acfc --- /dev/null +++ b/util/create.nix @@ -0,0 +1,29 @@ +let + inputs = import ./inputs.nix; + inherit (inputs) nixpkgs; + inherit (nixpkgs) lib; + recursivelyImport = import ./recursively-import.nix { inherit lib; }; +in +{ + systems = + definitions: + nixpkgs.lib.mapAttrs ( + name: info: + nixpkgs.lib.nixosSystem { + specialArgs = { + inherit inputs; + mainUser = info.user; + }; + modules = [ + inputs.home-manager.nixosModules.home-manager + (lib.mkAliasOptionModule [ "hm" ] [ "home-manager" "users" info.user ]) + { + home-manager.extraSpecialArgs = { + inherit inputs; + mainUser = info.user; + }; + } + ] ++ (recursivelyImport info.imports); + } + ) definitions; +} diff --git a/util/get-modules.nix b/util/get-modules.nix deleted file mode 100644 index ce5cdeb..0000000 --- a/util/get-modules.nix +++ /dev/null @@ -1,8 +0,0 @@ -inputs: -let - inherit (inputs.nixpkgs.lib) filterAttrs mapAttrsToList; - inherit (builtins) elem; -in -l: -filterAttrs (_: v: elem v l) inputs -|> mapAttrsToList (n: v: v.nixosModules.${n} or v.nixosModules.default) diff --git a/inputs.nix b/util/inputs.nix similarity index 81% rename from inputs.nix rename to util/inputs.nix index 3d9ffdb..c547536 100644 --- a/inputs.nix +++ b/util/inputs.nix @@ -1,5 +1,5 @@ let - lock = builtins.fromJSON (builtins.readFile ./flake.lock); + lock = builtins.fromJSON (builtins.readFile ../flake.lock); node = lock.nodes.root.inputs.__flake-compat; inherit (lock.nodes.${node}.locked) narHash rev url; flake-compat = builtins.fetchTarball { @@ -7,7 +7,7 @@ let sha256 = narHash; }; flake = import flake-compat { - src = ./.; + src = ../.; copySourceTreeToStore = false; useBuiltinsFetchTree = true; }; diff --git a/util/recursively-import.nix b/util/recursively-import.nix new file mode 100644 index 0000000..92b4fc0 --- /dev/null +++ b/util/recursively-import.nix @@ -0,0 +1,21 @@ +{ lib }: +let + recurseIntoFolders = + elem: + if lib.isPath elem && lib.pathIsDirectory elem then + lib.filesystem.listFilesRecursive elem + else + # If it's not a folder, return it unchanged. This handles single-files and + # literal modules (written with {} syntax) + lib.singleton elem; + + filterNixFiles = + paths: + builtins.filter + # filter the files for `.nix` files. if it's not a file, it can stay. + (path: !builtins.isPath path || lib.hasSuffix ".nix" path) + # Expand any folders into all the files within them. Note that this comes + # BEFORE the filtering that's happening above + (builtins.concatMap recurseIntoFolders paths); +in +filterNixFiles