From ad89d183fe1b49724f73669c054a5cf45eeafa7c Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 11:53:26 -0600 Subject: [PATCH 1/8] feat: neovim configuration with nvf --- users/jml/home.nix | 265 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 240 insertions(+), 25 deletions(-) diff --git a/users/jml/home.nix b/users/jml/home.nix index a26b392..f056c62 100644 --- a/users/jml/home.nix +++ b/users/jml/home.nix @@ -1,4 +1,10 @@ -{ username, pkgs, lib, ... }: +{ + username, + pkgs, + lib, + inputs, + ... +}: { nixpkgs.config.allowUnfree = true; # The following line is needed if I start using hyprland Home Manager Module @@ -10,8 +16,8 @@ sessionVariables = { EDITOR = "hx"; }; - - homeDirectory = + + homeDirectory = if pkgs.stdenv.isLinux then lib.mkDefault "/home/${username}" else if pkgs.stdenv.isDarwin then @@ -19,24 +25,26 @@ else abort "Unsupported OS"; }; - home.packages = with pkgs; [ ] - # linux only - # TODO: Add a test for linux + desktop environment - ++ (lib.optionals pkgs.stdenv.isLinux [ - cfspeedtest - helix - nil - ]) - # linux + desktop manager - #++ (lib.optionals (pkgs.stdenv.isLinux && osConfig.services.desktopManager.enabled != null) - #[ - # firefox - #]) - # darwin only - ++ (lib.optionals pkgs.stdenv.isDarwin [ - cfspeedtest - ripgrep - ]); + home.packages = + with pkgs; + [ ] + # linux only + # TODO: Add a test for linux + desktop environment + ++ (lib.optionals pkgs.stdenv.isLinux [ + cfspeedtest + helix + nil + ]) + # linux + desktop manager + #++ (lib.optionals (pkgs.stdenv.isLinux && osConfig.services.desktopManager.enabled != null) + #[ + # firefox + #]) + # darwin only + ++ (lib.optionals pkgs.stdenv.isDarwin [ + cfspeedtest + ripgrep + ]); programs = { fish.enable = true; @@ -100,7 +108,7 @@ Cryptomining = true; Fingerprinting = true; }; - + Homepage.StartPage = "previous-session"; FirefoxHome = { Search = true; @@ -133,12 +141,12 @@ id = 0; name = "default"; isDefault = true; - settings = { + settings = { "widget.disable-workspace-management" = true; }; search = { force = true; - default = "ddg"; # DuckDuckGo + default = "ddg"; # DuckDuckGo }; }; }; @@ -147,6 +155,7 @@ # TODO: figure out how to get config.programs..enable style # internal references inside this file. # There's some quirks with how this is used in lib/default.nix + # TODO: Use mergiraf for conflict resolution in jj too. programs.jujutsu = { enable = true; #enableFishIntegration = true; @@ -158,6 +167,8 @@ }; }; + # TODO: Configure Mergiraf + # https://mergiraf.org/introduction.html programs.git = { enable = true; settings = { @@ -191,6 +202,7 @@ init.defaultBranch = "main"; log.decorate = "full"; log.date = "iso"; + # NOTE: Initially diff3 was for me, now it's for me and mergiraf automation. merge.conflictStyle = "diff3"; }; # Cribbed from: https://github.com/gitattributes/gitattributes @@ -304,9 +316,212 @@ ''; }; + # TODO: Implement support for at least + # Nix, Python, Rust, Golang + # TODO: Sort out why TF, `.nix` files tabs are cooked in neovim rn. + # It corrects things on document save, but this line for example started with an 8-long tabstop + programs.nvf = { + enable = true; + # When using the Home-Manager Module for nvf, the settings go into the following attribute set. + # https://notashelf.github.io/nvf/index.xhtml#sec-hm-flakes + settings.vim = { + viAlias = true; + vimAlias = true; + + # TODO: For some reason spellcheck is having a very difficult time getting + # a wordlist. + #spellcheck = { + # enable = true; + # programmingWordlist.enable = true; + #}; + + lsp = { + enable = true; + formatOnSave = true; + lspkind.enable = false; + lightbulb.enable = true; + lspsaga.enable = false; + trouble.enable = true; + lspSignature.enable = false; + otter-nvim.enable = true; + nvim-docs-view.enable = true; + }; + + languages = { + enableDAP = true; + enableExtraDiagnostics = true; + enableFormat = true; + enableTreesitter = true; + + nix = { + enable = true; + lsp.enable = true; + lsp.server = "nixd"; + extraDiagnostics.enable = true; + format.enable = true; + format.type = "nixfmt"; + treesitter.enable = true; + }; + markdown.enable = true; + typst.enable = true; + + assembly.enable = true; + bash.enable = true; + clang.enable = true; + + python.enable = true; + rust = { + enable = true; + # TODO: null_ls is now deprecated. + # https://github.com/NotAShelf/nvf/issues/1175 + # https://github.com/NotAShelf/nvf/blob/main/.github/CONTRIBUTING.md + crates.enable = true; + }; + go.enable = true; + zig.enable = true; + + ts.enable = true; + html.enable = true; + css.enable = true; + sql.enable = true; + }; + + visuals = { + nvim-scrollbar.enable = true; # Configurable Visual Scrollbar (Can pair with Cursor, ALE, Diagnostics, Gitsigns, and hlslens) + nvim-web-devicons.enable = true; # Nerdfont Icons for use by other plugins + nvim-cursorline.enable = true; # Highlight Words & Lines on the cursor + cinnamon-nvim.enable = true; # Smooth Scrolling for any movement command. + fidget-nvim.enable = true; # UI for Notifications & LSP Progress Messages + + highlight-undo.enable = true; # Highlight changed text after any non-insert actions + indent-blankline.enable = true; # Indentation Guides + }; + + statusline = { + lualine = { + # Fancy Status Line + enable = true; + theme = "catppuccin"; + }; + }; + + theme = { + enable = true; + name = "catppuccin"; + style = "mocha"; + transparent = false; + }; + + autopairs.nvim-autopairs.enable = true; # Pair up ", {, (, etc. + # blink-cmp is a compiled rust binary while nvim-cmp is a pure lua plugin... + autocomplete.blink-cmp.enable = true; + # Code Snippets Engine /w support for Lua, VSCode, and SnipMate snippets. + snippets.luasnip.enable = true; + + filetree.neo-tree.enable = true; # Filesystem tree sidebar... + tabline.nvimBufferline.enable = true; # Shows buffers as tabs at the top. + treesitter.context.enable = true; + binds = { + whichKey.enable = true; # Shows your available keybindings in a popup + cheatsheet.enable = true; # Searchable in-editor cheatsheet that uses Telescope + }; + telescope.enable = true; # Fuzzy Finder, central to many other plugins. + + git = { + enable = true; + gitsigns.enable = true; # Git Info in Buffers + Gutters + gitsigns.codeActions.enable = false; + neogit.enable = true; # Interactive Git + }; + + # TODO: Consider switching to `minimap-nvim` for rust-based minimap. + # codewindow may be tightly integrated with treesitter though... + minimap.codewindow.enable = true; + dashboard.alpha.enable = true; # Greeter + notify.nvim-notify.enable = true; # Fancy Configurable Notification Manager + projects.project-nvim.enable = true; + + utility = { + ccc.enable = true; # Color Picker + diffview-nvim.enable = true; + icon-picker.enable = true; + surround.enable = true; # Change Surrounding Delimiter pairs `ysiw)` + leetcode-nvim.enable = true; # Allow solving LeetCode problems directly inside neovim + multicursors.enable = true; # Edit with multiple cursors simultaneously + smart-splits.enable = true; # Split-Pane Management + undotree.enable = true; # Undo history visualizer + nvim-biscuits.enable = true; # Shows the start of a code block from the bottom + + motion = { + # NOTE: https://github.com/smoka7/hop.nvim + hop.enable = true; # EasyMotion like, allowing you to jump anywhere in the document with as few keystrokes as possible + leap.enable = true; # Jump to anywhere visible + # TODO: I sort of hate how precognition injects itself in virtual + # lines, but I do like that it can be used to give a reminder. + precognition.enable = false; # Helps with discovering motions to navigate your current buffer + }; + images.img-clip.enable = true; + }; + + # TODO: Get Obsidian Working. + notes = { + # obsidian.enable = true; # neovim fails to build with this enabled. + mind-nvim.enable = true; + todo-comments.enable = true; + }; + + terminal = { + toggleterm = { + enable = true; + lazygit.enable = true; + }; + }; + + ui = { + borders.enable = true; + noice.enable = true; + colorizer.enable = true; + modes-nvim.enable = false; # this looks terrible with catppuccin + illuminate.enable = true; + breadcrumbs = { + enable = true; + navbuddy.enable = true; + }; + smartcolumn = { + enable = true; + setupOpts.custom_colorcolumn = { + nix = "110"; + ruby = "120"; + java = "130"; + go = [ + "90" + "130" + ]; + }; + }; + fastaction.enable = true; + }; + + assistant = { + chatgpt.enable = false; + copilot = { + enable = false; + cmp.enable = true; + }; + codecompanion-nvim.enable = false; + # avante-nvim.enable = true; + }; + + session.nvim-session-manager.enable = true; # Save sessions to reopen later + gestures.gesture-nvim.enable = false; # mouse gesture support? + comments.comment-nvim.enable = true; # Fancy commenting + presence.neocord.enable = true; # Discord Rich Presence + }; + }; + programs.vscode = { enable = true; - mutableExtensionsDir = true; # mutually exclusive to programs.vscode.profiles + mutableExtensionsDir = true; # mutually exclusive to programs.vscode.profiles profiles.default.userSettings = { "[nix]"."editor.tabSize" = 2; }; From 7f361458edcad1719cdcf80e2cac856006133520 Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 11:54:12 -0600 Subject: [PATCH 2/8] feat: add home-manager as a system package when my user is present --- users/jml/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/users/jml/default.nix b/users/jml/default.nix index 592e6ba..69afa40 100644 --- a/users/jml/default.nix +++ b/users/jml/default.nix @@ -1,6 +1,9 @@ { pkgs, lib, ... }: { programs.fish.enable = true; + environment.systemPackages = [ + pkgs.home-manager + ]; users.users.jml = { shell = pkgs.fish; home = From 5339eeebce9a546a6f7b3dc34ddb4f0eaf7da39e Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 11:56:03 -0600 Subject: [PATCH 3/8] feat: add gamemode and gamescope /w CAP_SYS_NICE --- modules/nixos/gaming.nix | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/nixos/gaming.nix b/modules/nixos/gaming.nix index 69dcd1b..1e86c7e 100644 --- a/modules/nixos/gaming.nix +++ b/modules/nixos/gaming.nix @@ -5,11 +5,12 @@ zw.gaming.enable = lib.mkEnableOption "Enable Gaming"; }; + # https://wiki.nixos.org/wiki/Category:Gaming config = lib.mkIf config.zw.gaming.enable { environment.systemPackages = with pkgs; [ mangohud protonup-qt - # lutris # TODO: Having an issue after flake update + lutris # TODO: Having an issue after flake update bottles heroic ]; @@ -20,5 +21,11 @@ protontricks.enable = true; gamescopeSession.enable = true; }; + + programs.gamemode.enable = true; + programs.gamescope = { + enable = true; + capSysNice = true; + }; }; } From b792e801c58aaeb7f4fce6d27e7a854701451357 Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 15:35:57 -0600 Subject: [PATCH 4/8] chore: fix a typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ec089f..e2a9b9e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Overview -This repository maanges **multiple NixOS systems** using a shared modular configuration. +This repository manages **multiple NixOS systems** using a shared modular configuration. It's designed to be **secure, composable, and automated** using modern Nix tooling. - **Laptop ("neon")**: Portable KVM/Swiss-Army Knife From e3e28fa662ecf19f3e8f5013334045fc2c6f7496 Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 15:40:37 -0600 Subject: [PATCH 5/8] horribly cobble together the ability to use both home-manager switch and nixos-rebuild switch against the same flake --- flake.lock | 120 +++++++++++++++++++++++++++++++----- flake.nix | 155 +++++++++++++++++++++++++++-------------------- lib/default.nix | 157 +++++++++++++++++++++++++++++++----------------- 3 files changed, 296 insertions(+), 136 deletions(-) diff --git a/flake.lock b/flake.lock index 87bf043..0bc246f 100644 --- a/flake.lock +++ b/flake.lock @@ -135,6 +135,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1751685974, + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", + "ref": "refs/heads/main", + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", + "revCount": 92, + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + }, + "original": { + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -157,6 +173,27 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1760948891, + "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "stylix", @@ -239,11 +276,11 @@ ] }, "locked": { - "lastModified": 1762787259, - "narHash": "sha256-t2U/GLLXHa2+kJkwnFNRVc2fEJ/lUfyZXBE5iKzJdcs=", + "lastModified": 1762964643, + "narHash": "sha256-RYHN8O/Aja59XDji6WSJZPkJpYVUfpSkyH+PEupBJqM=", "owner": "nix-community", "repo": "home-manager", - "rev": "37a3d97f2873e0f68711117c34d04b7c7ead8f4e", + "rev": "827f2a23373a774a8805f84ca5344654c31f354b", "type": "github" }, "original": { @@ -278,13 +315,28 @@ "type": "github" } }, + "mnw": { + "locked": { + "lastModified": 1758834834, + "narHash": "sha256-Y7IvY4F8vajZyp3WGf+KaiIVwondEkMFkt92Cr9NZmg=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "cfbc7d1cc832e318d0863a5fc91d940a96034001", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, "nixos-hardware": { "locked": { - "lastModified": 1762463231, - "narHash": "sha256-hv1mG5j5PTbnWbtHHomzTus77pIxsc4x8VrMjc7+/YE=", + "lastModified": 1762847253, + "narHash": "sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR+ZdLX8IbrU=", "owner": "nixos", "repo": "nixos-hardware", - "rev": "52113c4f5cfd1e823001310e56d9c8d0699a6226", + "rev": "899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9", "type": "github" }, "original": { @@ -295,11 +347,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1762596750, - "narHash": "sha256-rXXuz51Bq7DHBlfIjN7jO8Bu3du5TV+3DSADBX7/9YQ=", + "lastModified": 1762977756, + "narHash": "sha256-4PqRErxfe+2toFJFgcRKZ0UI9NSIOJa+7RXVtBhy4KE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b6a8526db03f735b89dd5ff348f53f752e7ddc8e", + "rev": "c5ae371f1a6a7fd27823bc500d9390b38c05fa55", "type": "github" }, "original": { @@ -334,6 +386,30 @@ "type": "github" } }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-parts": "flake-parts_2", + "mnw": "mnw", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1762622004, + "narHash": "sha256-NpzzgaoMK8aRHnndHWbYNKLcZN0r1y6icCoJvGoBsoE=", + "owner": "notashelf", + "repo": "nvf", + "rev": "09470524a214ed26633ddc2b6ec0c9bf31a8b909", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, "pre-commit-hooks-nix": { "inputs": { "flake-compat": [ @@ -367,6 +443,7 @@ "lanzaboote": "lanzaboote", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", + "nvf": "nvf", "sops-nix": "sops-nix", "stylix": "stylix" } @@ -399,11 +476,11 @@ ] }, "locked": { - "lastModified": 1762659808, - "narHash": "sha256-2Kv2mANf+FRisqhpfeZ8j9firBxb23ZvEXwdcunbpGI=", + "lastModified": 1763069729, + "narHash": "sha256-A91a+K0Q9wfdPLwL06e/kbHeAWSzPYy2EGdTDsyfb+s=", "owner": "Mic92", "repo": "sops-nix", - "rev": "524312bc62e3f34bd9231a2f66622663d3355133", + "rev": "a2bcd1c25c1d29e22756ccae094032ab4ada2268", "type": "github" }, "original": { @@ -419,13 +496,13 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "gnome-shell": "gnome-shell", "nixpkgs": [ "nixpkgs" ], "nur": "nur", - "systems": "systems", + "systems": "systems_2", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", @@ -461,6 +538,21 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tinted-foot": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 1bfd0d4..9af0fff 100644 --- a/flake.nix +++ b/flake.nix @@ -13,73 +13,96 @@ disko.inputs.nixpkgs.follows = "nixpkgs"; stylix.url = "github:nix-community/stylix"; stylix.inputs.nixpkgs.follows = "nixpkgs"; + + #obsidian-nvim.url = "github:epwalsh/obsidian.nvim"; + nvf = { + url = "github:notashelf/nvf"; + inputs.nixpkgs.follows = "nixpkgs"; + #inputs.obsidian-nvim.follows = "obsidian-nvim"; + }; }; # https://nix.dev/tutorials/nix-language.html#named-attribute-set-argument - outputs = inputs@{self, nixpkgs, nixos-hardware, home-manager, sops-nix, lanzaboote, disko, stylix, ...}: - let - mkSystem = (import ./lib { - inherit nixpkgs home-manager inputs; - }).mkSystem; - in - { - lib = { - mkSystem = mkSystem; + outputs = + inputs@{ + self, + nixpkgs, + nixos-hardware, + home-manager, + sops-nix, + lanzaboote, + disko, + stylix, + nvf, + ... + }: + let + zwLib = import ./lib { + inherit nixpkgs home-manager inputs; + }; + mkSystem = zwLib.mkSystem; + mkHome = zwLib.mkHome; + mkHomeConfigs = zwLib.mkHomeConfigs; + + # NOTE: Currently these are exclusively user-profiles which use home-manager. + # Their home-manager specific declarations are at ../users/${username}/home.nix + system = "x86_64-linux"; # TODO: Improve this from only static x86 to dynamic. + homeUserProfiles = { + jml = mkHome { + inherit system; # inputs; + username = "jml"; + extraModules = [ nvf.homeManagerModules.default ]; + }; + }; + in + { + lib = { + mkSystem = mkSystem; + }; + # NOTE: Run `nix flake show` to see what this flake has to offer. + # TODO: Enable automated formatting with something like numtide/treefmt-nix + nixosConfigurations = { + neon = mkSystem { + hostname = "neon"; + users = [ "jml" ]; + }; + lithium = mkSystem { + hostname = "lithium"; + # extraModules = [ inputs.sops-nix.nixosModules.sops ]; + users = [ + "jml" + "breakglass" + ]; + }; + titanium = mkSystem { + hostname = "titanium"; + users = [ + "jml" + ]; + homeUsers = { + jml = homeUserProfiles.jml.module; + }; + #extraModules = [ (import ./overlays) ]; + # NOTE: If I'm using a home-manager configuration on a given host, + # I also need to include the relevant modules. + # TODO: Can I instead self-reference the homeConfigurations in this flake? + extraModules = [ + stylix.nixosModules.stylix + ]; + }; + # `nix build .#nixosConfigurations.installIso.config.system.build.isoImage` + # https://github.com/nix-community/nixos-generators + installIso = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" + ]; + specialArgs = { inherit inputs; }; + }; + }; + + # For Debugging: `home-manager build --flake .` or `nix build .#homeConfigurations."jml".activationPackage` + # `home-manager switch --flake .#jml` + # https://nix-community.github.io/home-manager/options.xhtml + homeConfigurations = mkHomeConfigs homeUserProfiles; }; - # NOTE: Run `nix flake show` to see what this flake has to offer. - # TODO: Enable automated formatting with something like numtide/treefmt-nix - nixosConfigurations = { - neon = mkSystem { - hostname = "neon"; - users = [ "jml" ]; - }; - lithium = mkSystem { - hostname = "lithium"; - # extraModules = [ inputs.sops-nix.nixosModules.sops ]; - users = [ - "jml" - "breakglass" - ]; - }; - titanium = mkSystem { - hostname = "titanium"; - users = [ - "jml" - ]; - extraModules = [ - #(import ./overlays) - #stylix.nixosModules.stylix - { nixpkgs.config.allowUnfree = true; } - lanzaboote.nixosModules.lanzaboote - disko.nixosModules.disko - ./hosts/titanium/disko.nix - ({ pkgs, lib, ... }: { - environment.systemPackages = [ pkgs.sbctl ]; - boot.loader.systemd-boot.enable = lib.mkForce false; - boot.lanzaboote.enable = true; - boot.lanzaboote.pkiBundle = "/var/lib/sbctl"; - }) - ]; - }; - cobalt = mkSystem { - hostname = "cobalt"; - users = [ "jml" ]; - }; - # `nix build .#nixosConfigurations.installIso.config.system.build.isoImage` - # https://github.com/nix-community/nixos-generators - installIso = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" - ]; - specialArgs = {inherit inputs;}; - }; - }; - homeConfigurations = { - "jml" = home-manager.lib.homeManagerConfiguration { - modules = [ - ./users/jml/home.nix - ]; - }; - }; - }; } diff --git a/lib/default.nix b/lib/default.nix index 65ee05a..f3d2ac9 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,68 +1,113 @@ -{ nixpkgs, home-manager, inputs, ... }: +{ + nixpkgs, + home-manager, + inputs, + ... +}: let allOverlays = import (../overlays) { inherit nixpkgs; }; -in -{ - # It's not really that I care about whether a system is a desktop system or - # a server system, but moreso that I care about whether a system is headless or not. - # I also care about things like if it's darwin, or wsl. - # TODO: Expand this to actually make use of extraSpecialArgs and pass special - # args to the relevant places. - mkSystem = { - hostname, - system ? "x86_64-linux", - users ? [], - extraModules ? [], - extraSpecialArgs ? {} - }: - let - pkgs_with_overlays = import nixpkgs { + getPkgs = + system: + import nixpkgs { inherit system; overlays = allOverlays; }; - hostModule = import ../hosts/${hostname} { - inherit inputs; - pkgs = pkgs_with_overlays; - }; - userModules = map (name: - import ../users/${name} { - pkgs = pkgs_with_overlays; - lib = nixpkgs.lib; - } - ) users; - - homeUserNames = builtins.filter (name: - builtins.pathExists ../users/${name}/home.nix - ) users; - - homeUsers = nixpkgs.lib.listToAttrs (map (name: { - name = name; - value = import ../users/${name}/home.nix { - username = name; - pkgs = pkgs_with_overlays; - lib = nixpkgs.lib; +in +{ + mkSystem = + { + hostname, + system ? "x86_64-linux", + users ? [ ], + extraModules ? [ ], + homeUsers ? { }, + extraSpecialArgs ? { }, + }: + let + pkgs_with_overlays = import nixpkgs { + inherit system; + overlays = allOverlays; }; - }) homeUserNames); - in + hostModule = import ../hosts/${hostname} { + inherit inputs; + pkgs = pkgs_with_overlays; + }; + userModules = map ( + name: + import ../users/${name} { + pkgs = pkgs_with_overlays; + lib = nixpkgs.lib; + } + ) users; + + formattedHomeUsers = nixpkgs.lib.mapAttrs (username: moduleList: { + imports = moduleList; + }) homeUsers; + in nixpkgs.lib.nixosSystem { inherit system; - # pkgs = import inputs.nixpkgs { - # inherit system; - # overlays = allOverlays; - # config = { allowUnfree = true; nvidia.acceptLicense = true; }; - # }; - modules = [ hostModule ] - ++ userModules - ++ extraModules - ++ (if homeUserNames != [] then [ - home-manager.nixosModules.home-manager - { - home-manager.backupFileExtension = "hm-bak"; - home-manager.users = homeUsers; - } - ] else []); + modules = [ + hostModule + ] + ++ userModules + ++ extraModules + ++ ( + if homeUsers != { } then + [ + home-manager.nixosModules.home-manager + { + #home-manager.useGlobalPkgs = true; # NOTE: Incompatible with nixpkgs.{config,overlays} + home-manager.useUserPackages = true; + home-manager.backupFileExtension = "hm-bak"; + + # Directly inject the module lists? (isn't this the problem?) + home-manager.users = formattedHomeUsers; + home-manager.extraSpecialArgs = { inherit inputs; }; + } + ] + else + [ ] + ); specialArgs = { inherit inputs hostname; - } // extraSpecialArgs; + } + // extraSpecialArgs; }; + + getUserHomeModule = + username: pkgs: inputs: + import ../users/${username}/home.nix { + inherit username pkgs inputs; + lib = nixpkgs.lib; + }; + + /** + This function returns an attribute set { module, config }. + */ + mkHome = + { + username, + system ? "x86_64-linux", + extraModules ? [ ], + }: + let + pkgs_with_overlays = getPkgs system; + moduleList = [ + (import ../users/${username}/home.nix { + inherit inputs username; + pkgs = pkgs_with_overlays; + lib = nixpkgs.lib; + }) + ] + ++ extraModules; + in + { + module = moduleList; + config = home-manager.lib.homeManagerConfiguration { + pkgs = pkgs_with_overlays; + modules = moduleList; + }; + }; + + mkHomeConfigs = userProfiles: nixpkgs.lib.mapAttrs (username: profile: profile.config) userProfiles; } From 2cfac91660ebfe20cb33edb9d1e93bfa88ce1311 Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 18:39:51 -0600 Subject: [PATCH 6/8] snapshot of some host updates --- hosts/lithium/services/kanidm.nix | 2 +- hosts/neon/default.nix | 2 +- hosts/titanium/configuration.nix | 5 ++++- hosts/titanium/game-emulation.nix | 4 ++-- hosts/titanium/hardware.nix | 1 + hosts/titanium/meetings.nix | 4 ++++ hosts/titanium/nvidia.nix | 5 ++++- 7 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 hosts/titanium/meetings.nix diff --git a/hosts/lithium/services/kanidm.nix b/hosts/lithium/services/kanidm.nix index 066652f..b8b96de 100644 --- a/hosts/lithium/services/kanidm.nix +++ b/hosts/lithium/services/kanidm.nix @@ -44,7 +44,7 @@ in }; services.kanidm = { - package = pkgs.kanidmWithSecretProvisioning; + package = pkgs.kanidmWithSecretProvisioning_1_7; enableServer = true; serverSettings = { # NOTE: Required to start the server: https://kanidm.github.io/kanidm/stable/server_configuration.html diff --git a/hosts/neon/default.nix b/hosts/neon/default.nix index 6d3d3e0..bfe9f0c 100644 --- a/hosts/neon/default.nix +++ b/hosts/neon/default.nix @@ -3,7 +3,7 @@ imports = [ ../../modules/nixos/base.nix ../../modules/nixos/audio.nix - ../../modules/nixos/desktop.nix + ../../modules/nixos/desktop # https://github.com/NixOS/nixos-hardware/blob/master/README.md#using-nix-flakes-support inputs.nixos-hardware.nixosModules.gpd-pocket-3 # override from nixos-hardware diff --git a/hosts/titanium/configuration.nix b/hosts/titanium/configuration.nix index acc06b8..45987c6 100644 --- a/hosts/titanium/configuration.nix +++ b/hosts/titanium/configuration.nix @@ -6,9 +6,12 @@ environment.systemPackages = with pkgs; [ sbctl # Secure-Boot helix nil # nice for editing '.nix' - discord + (discord.override { withVencord = true; }) signal-desktop obs-studio + halloy # IRC + gimp3 + nyxt # browser ]; # Hardware Specific programs... #programs.ryzen-monitor-ng.enable = true; diff --git a/hosts/titanium/game-emulation.nix b/hosts/titanium/game-emulation.nix index b970492..e0ba3d2 100644 --- a/hosts/titanium/game-emulation.nix +++ b/hosts/titanium/game-emulation.nix @@ -15,8 +15,8 @@ let mupen64plus # Nintendo 64 - Maybe simple64 some day. dolphin # GameCube mgba # GameBoy / Color / Advance - melonds # Nintendo DS - citra # Nintendo 3DS + #melonds # Nintendo DS + #citra # Nintendo 3DS # Sony diff --git a/hosts/titanium/hardware.nix b/hosts/titanium/hardware.nix index 4204ed2..a11bb78 100644 --- a/hosts/titanium/hardware.nix +++ b/hosts/titanium/hardware.nix @@ -13,6 +13,7 @@ boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "sr_mod" ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-amd" ]; + # boot.blacklistedKernelModules = [ "nouveau" ]; boot.extraModulePackages = [ ]; fileSystems."/" = diff --git a/hosts/titanium/meetings.nix b/hosts/titanium/meetings.nix new file mode 100644 index 0000000..ed827ec --- /dev/null +++ b/hosts/titanium/meetings.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + programs.zoom-us.enable = true; +} diff --git a/hosts/titanium/nvidia.nix b/hosts/titanium/nvidia.nix index 66b3fa2..af7717f 100644 --- a/hosts/titanium/nvidia.nix +++ b/hosts/titanium/nvidia.nix @@ -14,9 +14,12 @@ # https://github.com/NixOS/nixpkgs/blob/master/pkgs/os-specific/linux/nvidia-x11/generic.nix#L65 nixpkgs.config.nvidia.acceptLicense = true; hardware.nvidia = { + # TODO: Consider legacy drivers. + # https://discourse.nixos.org/t/cant-use-nvidia-offload-mode/27791/8 package = config.boot.kernelPackages.nvidiaPackages.latest; modesetting.enable = true; - open = true; + # Open Source Drivers: https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus + open = false; nvidiaSettings = true; powerManagement.enable = false; powerManagement.finegrained = false; From 54f361da9e1ce8ca2fbacde299e8cb03864dc53f Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 18:45:03 -0600 Subject: [PATCH 7/8] excluding a local scratch notes file from the source tree --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f295f42..64b28b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ result -result-* \ No newline at end of file +result-* +localnotes.md \ No newline at end of file From 02f530c6b9756d4cc6af044f03c2d67e7779a886 Mon Sep 17 00:00:00 2001 From: Jay Looney Date: Tue, 25 Nov 2025 18:46:09 -0600 Subject: [PATCH 8/8] exclude qcow2 files from source tree --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 64b28b9..f2ccda5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ result result-* -localnotes.md \ No newline at end of file +localnotes.md +*.qcow2 \ No newline at end of file