diff --git a/flake.nix b/flake.nix index 87056ff..1d4c889 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,7 @@ packages = uGenPkgs (import ./packages); nixosConfigurations = import ./packages/hosts inputs; - # homeConfigurations = import ./packages/users; + homeConfigurations = import ./packages/home inputs; templates = import ./lib/templates; diff --git a/lib/modules/home/default.nix b/lib/modules/home/default.nix index e73da57..0103c7b 100644 --- a/lib/modules/home/default.nix +++ b/lib/modules/home/default.nix @@ -4,7 +4,7 @@ let inherit (outputs) homeManagerModules style; in { - common = + default = { pkgs, lib, @@ -15,17 +15,19 @@ in imports = with homeManagerModules; [ slippi.homeManagerModules.default # nix-colors.homeManagerModules.default - fish - homeManagerModules.helix - git - jujutsu - zellij - htop - sshconfig - senpai - iex - cargo - desktop + # fish + # helix + # git + # jujutsu + # zellij + # htop + # linux + # sshconfig + # senpai + # iex + # helix + # cargo + # desktop /* broot @@ -34,145 +36,159 @@ in */ ]; - programs.zellij.enable = true; - - programs.bat = { - enable = true; - config = { - theme = "ansi"; - }; - /* - themes = { - "Catppuccin-mocha" = builtins.readFile (pkgs.fetchFromGitHub - { - owner = "catppuccin"; - repo = "bat"; - rev = "477622171ec0529505b0ca3cada68fc9433648c6"; - sha256 = "6WVKQErGdaqb++oaXnY3i6/GuH2FhTgK0v4TN4Y0Wbw="; - } - + "/Catppuccin-mocha.tmTheme"); + options = { + lyte = { + shell = { + enable = lib.mkEnableOption "Enable home-manager shell configuration for the user"; }; - */ - }; - - home.shellAliases = { - cat = "bat"; - }; - - programs.home-manager.enable = true; - - programs.direnv.mise = { - enable = true; - }; - - programs.mise = { - enable = true; - enableFishIntegration = true; - enableBashIntegration = true; - enableZshIntegration = true; - }; - - programs.jujutsu = { - enable = true; - }; - - programs.jq = { - enable = true; - }; - - programs.btop = { - enable = true; - package = pkgs.btop.override { - rocmSupport = true; - }; - }; - - # services.ssh-agent.enable = true; - - home = { - sessionVariables = { - TERMINAL = "ghostty"; - EDITOR = "hx"; - VISUAL = "hx"; - PAGER = "less"; - MANPAGER = "less"; - }; - - packages = with pkgs; [ - # tools I use when editing nix code - # kanidm - alejandra - gnupg - (pkgs.buildEnv { - name = "my-common-scripts"; - paths = [ ./scripts/common ]; - }) - ]; - }; - - programs.direnv = { - enable = true; - nix-direnv.enable = true; - }; - - programs.skim = { - # https://github.com/lotabout/skim/issues/494 - enable = false; - enableFishIntegration = true; - defaultOptions = [ - "--no-clear-start" - "--color=16" - "--height=20" - ]; - }; - - programs.atuin = { - enable = true; - enableBashIntegration = config.programs.bash.enable; - enableFishIntegration = config.programs.fish.enable; - enableZshIntegration = config.programs.zsh.enable; - enableNushellIntegration = config.programs.nushell.enable; - - flags = [ - "--disable-up-arrow" - ]; - - settings = { - auto_sync = true; - sync_frequency = "1m"; - sync_address = "https://atuin.h.lyte.dev"; - keymap_mode = "vim-insert"; - inline_height = 20; - show_preview = true; - - sync = { - records = true; - }; - - dotfiles = { - enabled = true; + desktop = { + enable = lib.mkEnableOption "Enable home-manager desktop configuration for the user"; }; }; }; - programs.fzf = { - # using good ol' fzf until skim sucks less out of the box I guess - enable = true; - /* + config = { + programs.helix.enable = true; + programs.zellij.enable = true; + programs.eza.enable = true; + programs.bat = { + enable = true; + config = { + theme = "ansi"; + }; + /* + themes = { + "Catppuccin-mocha" = builtins.readFile (pkgs.fetchFromGitHub + { + owner = "catppuccin"; + repo = "bat"; + rev = "477622171ec0529505b0ca3cada68fc9433648c6"; + sha256 = "6WVKQErGdaqb++oaXnY3i6/GuH2FhTgK0v4TN4Y0Wbw="; + } + + "/Catppuccin-mocha.tmTheme"); + }; + */ + }; + + home.shellAliases = { + cat = "bat"; + }; + + programs.home-manager.enable = true; + + programs.direnv.mise = { + enable = true; + }; + + programs.mise = { + enable = true; enableFishIntegration = true; - defaultCommand = "fd --type f"; - defaultOptions = ["--height 40%"]; - fileWidgetOptions = ["--preview 'head {}'"]; - */ - }; + enableBashIntegration = true; + enableZshIntegration = true; + }; - # TODO: regular cron or something? - programs.nix-index = { - enable = true; + programs.jujutsu = { + enable = true; + }; - enableBashIntegration = config.programs.bash.enable; - enableFishIntegration = config.programs.fish.enable; - enableZshIntegration = config.programs.zsh.enable; + programs.jq = { + enable = true; + }; + + programs.btop = { + enable = true; + package = pkgs.btop.override { + rocmSupport = true; + }; + }; + + # services.ssh-agent.enable = true; + + home = { + sessionVariables = { + TERMINAL = "ghostty"; + EDITOR = "hx"; + VISUAL = "hx"; + PAGER = "less"; + MANPAGER = "less"; + }; + + packages = with pkgs; [ + # tools I use when editing nix code + # kanidm + alejandra + gnupg + (pkgs.buildEnv { + name = "my-common-scripts"; + paths = [ ./scripts/common ]; + }) + ]; + }; + + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; + + programs.skim = { + # https://github.com/lotabout/skim/issues/494 + enable = false; + enableFishIntegration = true; + defaultOptions = [ + "--no-clear-start" + "--color=16" + "--height=20" + ]; + }; + + programs.atuin = { + enable = true; + enableBashIntegration = config.programs.bash.enable; + enableFishIntegration = config.programs.fish.enable; + enableZshIntegration = config.programs.zsh.enable; + enableNushellIntegration = config.programs.nushell.enable; + + flags = [ + "--disable-up-arrow" + ]; + + settings = { + auto_sync = true; + sync_frequency = "1m"; + sync_address = "https://atuin.h.lyte.dev"; + keymap_mode = "vim-insert"; + inline_height = 20; + show_preview = true; + + sync = { + records = true; + }; + + dotfiles = { + enabled = true; + }; + }; + }; + + programs.fzf = { + # using good ol' fzf until skim sucks less out of the box I guess + enable = true; + /* + enableFishIntegration = true; + defaultCommand = "fd --type f"; + defaultOptions = ["--height 40%"]; + fileWidgetOptions = ["--preview 'head {}'"]; + */ + }; + + # TODO: regular cron or something? + programs.nix-index = { + enable = true; + + enableBashIntegration = config.programs.bash.enable; + enableFishIntegration = config.programs.fish.enable; + enableZshIntegration = config.programs.zsh.enable; + }; }; }; @@ -454,582 +470,583 @@ in helix = { + lib, config, - pkgs, ... }: { - # helix rust debugger stuff - # https://github.com/helix-editor/helix/wiki/Debugger-Configurations - home.file."${config.xdg.configHome}/lldb_vscode_rustc_primer.py" = { - text = '' - import subprocess - import pathlib - import lldb + config = lib.mkIf config.programs.helix.enable { + # helix rust debugger stuff + # https://github.com/helix-editor/helix/wiki/Debugger-Configurations + home.file."${config.xdg.configHome}/lldb_vscode_rustc_primer.py" = { + text = '' + import subprocess + import pathlib + import lldb - # Determine the sysroot for the active Rust interpreter - rustlib_etc = pathlib.Path(subprocess.getoutput('rustc --print sysroot')) / 'lib' / 'rustlib' / 'etc' - if not rustlib_etc.exists(): - raise RuntimeError('Unable to determine rustc sysroot') + # Determine the sysroot for the active Rust interpreter + rustlib_etc = pathlib.Path(subprocess.getoutput('rustc --print sysroot')) / 'lib' / 'rustlib' / 'etc' + if not rustlib_etc.exists(): + raise RuntimeError('Unable to determine rustc sysroot') - # Load lldb_lookup.py and execute lldb_commands with the correct path - lldb.debugger.HandleCommand(f"""command script import "{rustlib_etc / 'lldb_lookup.py'}" """) - lldb.debugger.HandleCommand(f"""command source -s 0 "{rustlib_etc / 'lldb_commands'}" """) - ''; - }; - - /* - NOTE: Currently, helix crashes when editing markdown in certain scenarios, - presumably due to an old markdown treesitter grammar - https://github.com/helix-editor/helix/issues/9011 - https://github.com/helix-editor/helix/issues/8821 - https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/114 - */ - - programs.helix = { - enable = true; - languages = { - language-server = { - lexical = { - command = "lexical"; - args = [ "start" ]; - }; - - /* - next-ls = { - command = "next-ls"; - args = ["--stdout"]; - }; - - deno = { - command = "deno"; - args = ["lsp"]; - config = { - enable = true; - lint = true; - unstable = true; - }; - }; - */ - }; - - language = [ - /* - { - name = "heex"; - scope = "source.heex"; - injection-regex = "heex"; - language-servers = ["lexical"]; # "lexical" "next-ls" ? - auto-format = true; - file-types = ["heex"]; - roots = ["mix.exs" "mix.lock"]; - indent = { - tab-width = 2; - unit = " "; - }; - } - { - name = "elixir"; - language-servers = ["lexical"]; # "lexical" "next-ls" ? - auto-format = true; - } - */ - { - name = "rust"; - - debugger = { - name = "lldb-vscode"; - transport = "stdio"; - command = "lldb-vscode"; - templates = [ - { - name = "binary"; - request = "launch"; - completion = [ - { - name = "binary"; - completion = "filename"; - } - ]; - args = { - program = "{0}"; - initCommands = [ "command script import ${config.xdg.configHome}/lldb_vscode_rustc_primer.py" ]; - }; - } - ]; - }; - } - { - name = "html"; - file-types = [ "html" ]; - scope = "source.html"; - auto-format = false; - } - { - name = "nix"; - file-types = [ "nix" ]; - scope = "source.nix"; - auto-format = true; - formatter = { - command = "alejandra"; - args = [ "-" ]; - }; - } - { - name = "fish"; - file-types = [ "fish" ]; - scope = "source.fish"; - auto-format = true; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - { - name = "toml"; - file-types = [ "toml" ]; - scope = "source.toml"; - auto-format = true; - } - - /* - { - name = "javascript"; - language-id = "javascript"; - grammar = "javascript"; - scope = "source.js"; - injection-regex = "^(js|javascript)$"; - file-types = ["js" "mjs"]; - shebangs = ["deno"]; - language-servers = ["deno"]; - roots = ["deno.jsonc" "deno.json"]; - formatter = { - command = "deno"; - args = ["fmt"]; - }; - auto-format = true; - comment-token = "//"; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - - { - name = "typescript"; - language-id = "typescript"; - grammar = "typescript"; - scope = "source.ts"; - injection-regex = "^(ts|typescript)$"; - file-types = ["ts"]; - shebangs = ["deno"]; - language-servers = ["deno"]; - roots = ["deno.jsonc" "deno.json"]; - formatter = { - command = "deno"; - args = ["fmt"]; - }; - auto-format = true; - comment-token = "//"; - indent = { - tab-width = 2; - unit = "\t"; - }; - } - - { - name = "jsonc"; - language-id = "json"; - grammar = "jsonc"; - scope = "source.jsonc"; - injection-regex = "^(jsonc)$"; - roots = ["deno.jsonc" "deno.json"]; - file-types = ["jsonc"]; - language-servers = ["deno"]; - indent = { - tab-width = 2; - unit = " "; - }; - auto-format = true; - } - */ - ]; + # Load lldb_lookup.py and execute lldb_commands with the correct path + lldb.debugger.HandleCommand(f"""command script import "{rustlib_etc / 'lldb_lookup.py'}" """) + lldb.debugger.HandleCommand(f"""command source -s 0 "{rustlib_etc / 'lldb_commands'}" """) + ''; }; - settings = { - theme = "custom"; + /* + NOTE: Currently, helix crashes when editing markdown in certain scenarios, + presumably due to an old markdown treesitter grammar + https://github.com/helix-editor/helix/issues/9011 + https://github.com/helix-editor/helix/issues/8821 + https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/114 + */ - editor = { - soft-wrap.enable = true; - auto-pairs = false; - bufferline = "multiple"; - rulers = [ - 81 - 121 - ]; - cursorline = true; - - /* - auto-save = false; - completion-trigger-len = 1; - color-modes = false; - scrolloff = 8; - */ - - inline-diagnostics = { - cursor-line = "hint"; - other-lines = "error"; - }; - - cursor-shape = { - normal = "block"; - insert = "bar"; - select = "underline"; - }; - - file-picker.hidden = false; - indent-guides = { - render = true; - character = "▏"; - }; - - lsp = { - display-messages = true; - # display-inlay-hints = true; - }; - statusline = { - separator = " "; - mode = { - "normal" = "N"; - "insert" = "I"; - "select" = "S"; + programs.helix = { + languages = { + language-server = { + lexical = { + command = "lexical"; + args = [ "start" ]; }; - left = [ - "file-name" - "mode" - /* - "selections" - "primary-selection-length" - "position" - "position-percentage" - */ - "spinner" - "diagnostics" - "workspace-diagnostics" - ]; + /* - center = ["file-name"]; - right = ["version-control" "total-line-numbers" "file-encoding"]; + next-ls = { + command = "next-ls"; + args = ["--stdout"]; + }; + + deno = { + command = "deno"; + args = ["lsp"]; + config = { + enable = true; + lint = true; + unstable = true; + }; + }; */ }; + + language = [ + /* + { + name = "heex"; + scope = "source.heex"; + injection-regex = "heex"; + language-servers = ["lexical"]; # "lexical" "next-ls" ? + auto-format = true; + file-types = ["heex"]; + roots = ["mix.exs" "mix.lock"]; + indent = { + tab-width = 2; + unit = " "; + }; + } + { + name = "elixir"; + language-servers = ["lexical"]; # "lexical" "next-ls" ? + auto-format = true; + } + */ + { + name = "rust"; + + debugger = { + name = "lldb-vscode"; + transport = "stdio"; + command = "lldb-vscode"; + templates = [ + { + name = "binary"; + request = "launch"; + completion = [ + { + name = "binary"; + completion = "filename"; + } + ]; + args = { + program = "{0}"; + initCommands = [ "command script import ${config.xdg.configHome}/lldb_vscode_rustc_primer.py" ]; + }; + } + ]; + }; + } + { + name = "html"; + file-types = [ "html" ]; + scope = "source.html"; + auto-format = false; + } + { + name = "nix"; + file-types = [ "nix" ]; + scope = "source.nix"; + auto-format = true; + formatter = { + command = "alejandra"; + args = [ "-" ]; + }; + } + { + name = "fish"; + file-types = [ "fish" ]; + scope = "source.fish"; + auto-format = true; + indent = { + tab-width = 2; + unit = "\t"; + }; + } + { + name = "toml"; + file-types = [ "toml" ]; + scope = "source.toml"; + auto-format = true; + } + + /* + { + name = "javascript"; + language-id = "javascript"; + grammar = "javascript"; + scope = "source.js"; + injection-regex = "^(js|javascript)$"; + file-types = ["js" "mjs"]; + shebangs = ["deno"]; + language-servers = ["deno"]; + roots = ["deno.jsonc" "deno.json"]; + formatter = { + command = "deno"; + args = ["fmt"]; + }; + auto-format = true; + comment-token = "//"; + indent = { + tab-width = 2; + unit = "\t"; + }; + } + + { + name = "typescript"; + language-id = "typescript"; + grammar = "typescript"; + scope = "source.ts"; + injection-regex = "^(ts|typescript)$"; + file-types = ["ts"]; + shebangs = ["deno"]; + language-servers = ["deno"]; + roots = ["deno.jsonc" "deno.json"]; + formatter = { + command = "deno"; + args = ["fmt"]; + }; + auto-format = true; + comment-token = "//"; + indent = { + tab-width = 2; + unit = "\t"; + }; + } + + { + name = "jsonc"; + language-id = "json"; + grammar = "jsonc"; + scope = "source.jsonc"; + injection-regex = "^(jsonc)$"; + roots = ["deno.jsonc" "deno.json"]; + file-types = ["jsonc"]; + language-servers = ["deno"]; + indent = { + tab-width = 2; + unit = " "; + }; + auto-format = true; + } + */ + ]; }; - keys = { - insert = { - j = { - k = "normal_mode"; - j = "normal_mode"; - K = "normal_mode"; - J = "normal_mode"; + + settings = { + theme = "custom"; + + editor = { + soft-wrap.enable = true; + auto-pairs = false; + bufferline = "multiple"; + rulers = [ + 81 + 121 + ]; + cursorline = true; + + /* + auto-save = false; + completion-trigger-len = 1; + color-modes = false; + scrolloff = 8; + */ + + inline-diagnostics = { + cursor-line = "hint"; + other-lines = "error"; + }; + + cursor-shape = { + normal = "block"; + insert = "bar"; + select = "underline"; + }; + + file-picker.hidden = false; + indent-guides = { + render = true; + character = "▏"; + }; + + lsp = { + display-messages = true; + # display-inlay-hints = true; + }; + statusline = { + separator = " "; + mode = { + "normal" = "N"; + "insert" = "I"; + "select" = "S"; + }; + left = [ + "file-name" + "mode" + /* + "selections" + "primary-selection-length" + "position" + "position-percentage" + */ + "spinner" + "diagnostics" + "workspace-diagnostics" + ]; + /* + center = ["file-name"]; + right = ["version-control" "total-line-numbers" "file-encoding"]; + */ }; }; - - normal = { - "C-k" = "jump_view_up"; - "C-j" = "jump_view_down"; - "C-h" = "jump_view_left"; - "C-l" = "jump_view_right"; - "C-q" = ":quit-all!"; - # "L" = "repeat_last_motion"; - space = { - q = ":reflow 80"; - Q = ":reflow 120"; - C = ":bc!"; - h = ":toggle lsp.display-inlay-hints"; - # O = ["select_textobject_inner WORD", ":pipe-to xargs xdg-open"]; + keys = { + insert = { + j = { + k = "normal_mode"; + j = "normal_mode"; + K = "normal_mode"; + J = "normal_mode"; + }; }; - }; - select = { - space = { - q = ":reflow 80"; - Q = ":reflow 120"; + normal = { + "C-k" = "jump_view_up"; + "C-j" = "jump_view_down"; + "C-h" = "jump_view_left"; + "C-l" = "jump_view_right"; + "C-q" = ":quit-all!"; + # "L" = "repeat_last_motion"; + space = { + q = ":reflow 80"; + Q = ":reflow 120"; + C = ":bc!"; + h = ":toggle lsp.display-inlay-hints"; + # O = ["select_textobject_inner WORD", ":pipe-to xargs xdg-open"]; + }; + }; + + select = { + space = { + q = ":reflow 80"; + Q = ":reflow 120"; + }; + # "L" = "repeat_last_motion"; }; - # "L" = "repeat_last_motion"; }; }; - }; - themes = with style.colors.withHashPrefix; { - custom = { - "type" = orange; + themes = with style.colors.withHashPrefix; { + custom = { + "type" = orange; - "constructor" = blue; + "constructor" = blue; - "constant" = orange; - "constant.builtin" = orange; - "constant.character" = yellow; - "constant.character.escape" = orange; + "constant" = orange; + "constant.builtin" = orange; + "constant.character" = yellow; + "constant.character.escape" = orange; - "string" = green; - "string.regexp" = orange; - "string.special" = blue; + "string" = green; + "string.regexp" = orange; + "string.special" = blue; - "comment" = { - fg = fgdim; - modifiers = [ "italic" ]; - }; - - "variable" = text; - "variable.parameter" = { - fg = red; - modifiers = [ "italic" ]; - }; - "variable.builtin" = red; - "variable.other.member" = text; - - "label" = blue; - - "punctuation" = fgdim; - "punctuation.special" = blue; - - "keyword" = purple; - "keyword.storage.modifier.ref" = yellow; - "keyword.control.conditional" = { - fg = purple; - modifiers = [ "italic" ]; - }; - - "operator" = blue; - - "function" = blue; - "function.macro" = purple; - - "tag" = purple; - "attribute" = blue; - - "namespace" = { - fg = blue; - modifiers = [ "italic" ]; - }; - - "special" = blue; - - "markup.heading.marker" = { - fg = orange; - modifiers = [ "bold" ]; - }; - "markup.heading.1" = blue; - "markup.heading.2" = yellow; - "markup.heading.3" = green; - "markup.heading.4" = orange; - "markup.heading.5" = red; - "markup.heading.6" = fg3; - "markup.list" = purple; - "markup.bold" = { - modifiers = [ "bold" ]; - }; - "markup.italic" = { - modifiers = [ "italic" ]; - }; - "markup.strikethrough" = { - modifiers = [ "crossed_out" ]; - }; - "markup.link.url" = { - fg = red; - modifiers = [ "underlined" ]; - }; - "markup.link.text" = blue; - "markup.raw" = red; - - "diff.plus" = green; - "diff.minus" = red; - "diff.delta" = blue; - - "ui.linenr" = { - fg = fgdim; - }; - "ui.linenr.selected" = { - fg = fg2; - }; - - "ui.statusline" = { - fg = fgdim; - bg = bg; - }; - "ui.statusline.inactive" = { - fg = fg3; - bg = bg2; - }; - "ui.statusline.normal" = { - fg = bg; - bg = purple; - modifiers = [ "bold" ]; - }; - "ui.statusline.insert" = { - fg = bg; - bg = green; - modifiers = [ "bold" ]; - }; - "ui.statusline.select" = { - fg = bg; - bg = red; - modifiers = [ "bold" ]; - }; - - "ui.popup" = { - fg = text; - bg = bg2; - }; - "ui.window" = { - fg = fgdim; - }; - "ui.help" = { - fg = fg2; - bg = bg2; - }; - - "ui.bufferline" = { - fg = fgdim; - bg = bg2; - }; - "ui.bufferline.background" = { - bg = bg2; - }; - - "ui.text" = text; - "ui.text.focus" = { - fg = text; - bg = bg3; - modifiers = [ "bold" ]; - }; - "ui.text.inactive" = { - fg = fg2; - }; - - "ui.virtual" = fg2; - "ui.virtual.ruler" = { - bg = bg3; - }; - "ui.virtual.indent-guide" = bg3; - "ui.virtual.inlay-hint" = { - fg = bg3; - bg = bg; - }; - - "ui.selection" = { - bg = bg5; - }; - - "ui.cursor" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary" = { - fg = bg; - bg = red; - }; - "ui.cursor.match" = { - fg = orange; - modifiers = [ "bold" ]; - }; - - "ui.cursor.primary.normal" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary.insert" = { - fg = bg; - bg = text; - }; - "ui.cursor.primary.select" = { - fg = bg; - bg = text; - }; - - "ui.cursor.normal" = { - fg = bg; - bg = fg; - }; - "ui.cursor.insert" = { - fg = bg; - bg = fg; - }; - "ui.cursor.select" = { - fg = bg; - bg = fg; - }; - - "ui.cursorline.primary" = { - bg = bg3; - }; - - "ui.highlight" = { - bg = bg3; - fg = bg; - modifiers = [ "bold" ]; - }; - - "ui.menu" = { - fg = fg3; - bg = bg2; - }; - "ui.menu.selected" = { - fg = text; - bg = bg3; - modifiers = [ "bold" ]; - }; - - "diagnostic.error" = { - underline = { - color = red; - style = "curl"; + "comment" = { + fg = fgdim; + modifiers = [ "italic" ]; }; - }; - "diagnostic.warning" = { - underline = { - color = orange; - style = "curl"; - }; - }; - "diagnostic.info" = { - underline = { - color = blue; - style = "curl"; - }; - }; - "diagnostic.hint" = { - underline = { - color = blue; - style = "curl"; - }; - }; - error = red; - warning = orange; - info = blue; - hint = yellow; - "ui.background" = { - bg = bg; - fg = fgdim; - }; + "variable" = text; + "variable.parameter" = { + fg = red; + modifiers = [ "italic" ]; + }; + "variable.builtin" = red; + "variable.other.member" = text; - /* - "ui.cursorline.primary" = { bg = "default" } - "ui.cursorline.secondary" = { bg = "default" } - */ - "ui.cursorcolumn.primary" = { - bg = bg3; - }; - "ui.cursorcolumn.secondary" = { - bg = bg3; - }; + "label" = blue; - "ui.bufferline.active" = { - fg = primary; - bg = bg3; - underline = { - color = primary; - style = ""; + "punctuation" = fgdim; + "punctuation.special" = blue; + + "keyword" = purple; + "keyword.storage.modifier.ref" = yellow; + "keyword.control.conditional" = { + fg = purple; + modifiers = [ "italic" ]; + }; + + "operator" = blue; + + "function" = blue; + "function.macro" = purple; + + "tag" = purple; + "attribute" = blue; + + "namespace" = { + fg = blue; + modifiers = [ "italic" ]; + }; + + "special" = blue; + + "markup.heading.marker" = { + fg = orange; + modifiers = [ "bold" ]; + }; + "markup.heading.1" = blue; + "markup.heading.2" = yellow; + "markup.heading.3" = green; + "markup.heading.4" = orange; + "markup.heading.5" = red; + "markup.heading.6" = fg3; + "markup.list" = purple; + "markup.bold" = { + modifiers = [ "bold" ]; + }; + "markup.italic" = { + modifiers = [ "italic" ]; + }; + "markup.strikethrough" = { + modifiers = [ "crossed_out" ]; + }; + "markup.link.url" = { + fg = red; + modifiers = [ "underlined" ]; + }; + "markup.link.text" = blue; + "markup.raw" = red; + + "diff.plus" = green; + "diff.minus" = red; + "diff.delta" = blue; + + "ui.linenr" = { + fg = fgdim; + }; + "ui.linenr.selected" = { + fg = fg2; + }; + + "ui.statusline" = { + fg = fgdim; + bg = bg; + }; + "ui.statusline.inactive" = { + fg = fg3; + bg = bg2; + }; + "ui.statusline.normal" = { + fg = bg; + bg = purple; + modifiers = [ "bold" ]; + }; + "ui.statusline.insert" = { + fg = bg; + bg = green; + modifiers = [ "bold" ]; + }; + "ui.statusline.select" = { + fg = bg; + bg = red; + modifiers = [ "bold" ]; + }; + + "ui.popup" = { + fg = text; + bg = bg2; + }; + "ui.window" = { + fg = fgdim; + }; + "ui.help" = { + fg = fg2; + bg = bg2; + }; + + "ui.bufferline" = { + fg = fgdim; + bg = bg2; + }; + "ui.bufferline.background" = { + bg = bg2; + }; + + "ui.text" = text; + "ui.text.focus" = { + fg = text; + bg = bg3; + modifiers = [ "bold" ]; + }; + "ui.text.inactive" = { + fg = fg2; + }; + + "ui.virtual" = fg2; + "ui.virtual.ruler" = { + bg = bg3; + }; + "ui.virtual.indent-guide" = bg3; + "ui.virtual.inlay-hint" = { + fg = bg3; + bg = bg; + }; + + "ui.selection" = { + bg = bg5; + }; + + "ui.cursor" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary" = { + fg = bg; + bg = red; + }; + "ui.cursor.match" = { + fg = orange; + modifiers = [ "bold" ]; + }; + + "ui.cursor.primary.normal" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary.insert" = { + fg = bg; + bg = text; + }; + "ui.cursor.primary.select" = { + fg = bg; + bg = text; + }; + + "ui.cursor.normal" = { + fg = bg; + bg = fg; + }; + "ui.cursor.insert" = { + fg = bg; + bg = fg; + }; + "ui.cursor.select" = { + fg = bg; + bg = fg; + }; + + "ui.cursorline.primary" = { + bg = bg3; + }; + + "ui.highlight" = { + bg = bg3; + fg = bg; + modifiers = [ "bold" ]; + }; + + "ui.menu" = { + fg = fg3; + bg = bg2; + }; + "ui.menu.selected" = { + fg = text; + bg = bg3; + modifiers = [ "bold" ]; + }; + + "diagnostic.error" = { + underline = { + color = red; + style = "curl"; + }; + }; + "diagnostic.warning" = { + underline = { + color = orange; + style = "curl"; + }; + }; + "diagnostic.info" = { + underline = { + color = blue; + style = "curl"; + }; + }; + "diagnostic.hint" = { + underline = { + color = blue; + style = "curl"; + }; + }; + + error = red; + warning = orange; + info = blue; + hint = yellow; + "ui.background" = { + bg = bg; + fg = fgdim; + }; + + /* + "ui.cursorline.primary" = { bg = "default" } + "ui.cursorline.secondary" = { bg = "default" } + */ + "ui.cursorcolumn.primary" = { + bg = bg3; + }; + "ui.cursorcolumn.secondary" = { + bg = bg3; + }; + + "ui.bufferline.active" = { + fg = primary; + bg = bg3; + underline = { + color = primary; + style = ""; + }; }; }; }; @@ -1164,38 +1181,34 @@ in ... }: { - imports = [ - { - config = lib.mkIf config.lyte.shell { - programs.fish = { - shellAliases = { - disks = "df -h && lsblk"; - sctl = "sudo systemctl"; - bt = "bluetoothctl"; - pa = "pulsemixer"; - sctlu = "systemctl --user"; - }; - - functions = { - pp = '' - if test (count $argv) -gt 0 - while true; ping -O -i 1 -w 5 -c 10000000 $argv; sleep 1; end - else - while true; ping -O -i 1 -w 5 -c 10000000 1.1.1.1; sleep 1; end - end - ''; - }; - }; - - home.packages = [ - (pkgs.buildEnv { - name = "my-linux-scripts"; - paths = [ ./scripts/linux ]; - }) - ]; + config = lib.mkIf (config.lyte.shell && lib.strings.hasSuffix "linux" pkgs.system) { + programs.fish = { + shellAliases = { + disks = "df -h && lsblk"; + sctl = "sudo systemctl"; + bt = "bluetoothctl"; + pa = "pulsemixer"; + sctlu = "systemctl --user"; }; - } - ]; + + functions = { + pp = '' + if test (count $argv) -gt 0 + while true; ping -O -i 1 -w 5 -c 10000000 $argv; sleep 1; end + else + while true; ping -O -i 1 -w 5 -c 10000000 1.1.1.1; sleep 1; end + end + ''; + }; + }; + + home.packages = [ + (pkgs.buildEnv { + name = "my-linux-scripts"; + paths = [ ./scripts/linux ]; + }) + ]; + }; }; password-manager = @@ -1823,7 +1836,7 @@ in }; daniel = - { config, ... }: + { ... }: { home = { diff --git a/lib/modules/home/fish.nix b/lib/modules/home/fish.nix index 0239890..8e6ce5c 100644 --- a/lib/modules/home/fish.nix +++ b/lib/modules/home/fish.nix @@ -1,91 +1,94 @@ -{ pkgs, ... }: { - home = { - packages = [ - pkgs.gawk # used in prompt - ]; - }; - - programs.eza = { - enable = true; - }; - - programs.fish = { - enable = true; - # I load long scripts from files for a better editing experience - shellInit = builtins.readFile ./fish/shellInit.fish; - interactiveShellInit = builtins.readFile ./fish/interactiveShellInit.fish; - loginShellInit = ""; - functions = { - # TODO: I think these should be loaded from fish files too for better editor experience? - d = '' - # --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files." - if count $argv > /dev/null - cd $argv - else - cd $NICE_HOME - end - la - ''; - - c = '' - if count $argv > /dev/null - cd $NICE_HOME && d $argv - else - d $NICE_HOME - end - ''; - - ltl = '' - set d $argv[1] . - set -l l "" - for f in $d[1]/* - if test -z $l; set l $f; continue; end - if command test $f -nt $l; and test ! -d $f - set l $f - end - end - echo $l - ''; - - has_command = "command --quiet --search $argv[1]"; + lib, + config, + pkgs, + ... +}: +{ + config = lib.mkIf config.programs.fish.enable { + home = { + packages = [ + pkgs.gawk # used in prompt + ]; }; - shellAbbrs = { }; - shellAliases = { - # TODO: an alias that wraps `rm` such that if we run it without git committing first (when in a git repo) - ls = "eza --group-directories-first --classify"; - l = "ls"; - ll = "ls --long --group"; - la = "ll --all"; - lA = "la --all"; # --all twice to show . and .. - tree = "ls --tree --level=3"; - lt = "ll --sort=modified"; - lat = "la --sort=modified"; - lc = "lt --sort=accessed"; - lT = "lt --reverse"; - lC = "lc --reverse"; - lD = "la --only-dirs"; - "cd.." = "d .."; - "cdc" = "d $XDG_CONFIG_HOME"; - "cdn" = "d $NOTES_PATH"; - "cdl" = "d $XDG_DOWNLOAD_DIR"; - "cdg" = "d $XDG_GAMES_DIR"; - ".." = "d .."; - "..." = "d ../.."; - "...." = "d ../../.."; - "....." = "d ../../../.."; - "......" = "d ../../../../.."; - "......." = "d ../../../../../.."; - "........" = "d ../../../../../../.."; - "........." = "d ../../../../../../../.."; - p = "ping"; - dc = "docker compose"; - pc = "podman-compose"; - k = "kubectl"; - kg = "kubectl get"; - v = "$EDITOR"; - sv = "sudo $EDITOR"; - kssh = "kitty +kitten ssh"; + + programs.fish = { + # enable = true; + # I load long scripts from files for a better editing experience + shellInit = builtins.readFile ./fish/shellInit.fish; + interactiveShellInit = builtins.readFile ./fish/interactiveShellInit.fish; + loginShellInit = ""; + functions = { + # TODO: I think these should be loaded from fish files too for better editor experience? + d = '' + # --wraps=cd --description "Quickly jump to NICE_HOME (or given relative or absolute path) and list files." + if count $argv > /dev/null + cd $argv + else + cd $NICE_HOME + end + la + ''; + + c = '' + if count $argv > /dev/null + cd $NICE_HOME && d $argv + else + d $NICE_HOME + end + ''; + + ltl = '' + set d $argv[1] . + set -l l "" + for f in $d[1]/* + if test -z $l; set l $f; continue; end + if command test $f -nt $l; and test ! -d $f + set l $f + end + end + echo $l + ''; + + has_command = "command --quiet --search $argv[1]"; + }; + shellAbbrs = { }; + shellAliases = { + # TODO: an alias that wraps `rm` such that if we run it without git committing first (when in a git repo) + ls = "eza --group-directories-first --classify"; + l = "ls"; + ll = "ls --long --group"; + la = "ll --all"; + lA = "la --all"; # --all twice to show . and .. + tree = "ls --tree --level=3"; + lt = "ll --sort=modified"; + lat = "la --sort=modified"; + lc = "lt --sort=accessed"; + lT = "lt --reverse"; + lC = "lc --reverse"; + lD = "la --only-dirs"; + "cd.." = "d .."; + "cdc" = "d $XDG_CONFIG_HOME"; + "cdn" = "d $NOTES_PATH"; + "cdl" = "d $XDG_DOWNLOAD_DIR"; + "cdg" = "d $XDG_GAMES_DIR"; + ".." = "d .."; + "..." = "d ../.."; + "...." = "d ../../.."; + "....." = "d ../../../.."; + "......" = "d ../../../../.."; + "......." = "d ../../../../../.."; + "........" = "d ../../../../../../.."; + "........." = "d ../../../../../../../.."; + p = "ping"; + dc = "docker compose"; + pc = "podman-compose"; + k = "kubectl"; + kg = "kubectl get"; + v = "$EDITOR"; + sv = "sudo $EDITOR"; + kssh = "kitty +kitten ssh"; + }; }; }; } diff --git a/lib/modules/nixos/default-module.nix b/lib/modules/nixos/default-module.nix new file mode 100644 index 0000000..21869e3 --- /dev/null +++ b/lib/modules/nixos/default-module.nix @@ -0,0 +1,192 @@ +{ + sops-nix, + disko, + slippi, + self, + ... +}: +{ + home-manager, + modulesPath, + lib, + config, + ... +}: +{ + imports = with self.outputs.nixosModules; [ + (modulesPath + "/installer/scan/not-detected.nix") + # home-manager.nixosModules.home-manager + sops-nix.nixosModules.sops + disko.nixosModules.disko + slippi.nixosModules.default + # deno-netlify-ddns-client + # shell-defaults-and-applications + + # desktop + # wifi + # printing + # podman + # virtual-machines + # postgres + # gaming + # daniel + ]; + + config = { + nixpkgs = { + config.allowUnfree = lib.mkDefault true; + overlays = [ self.flakeLib.forSelfOverlay ]; + }; + nix = { + nixPath = lib.mapAttrsToList (key: value: "${key}=${value.to.path}") config.nix.registry; + # registry = lib.mapAttrs (_: value: { flake = value; }) self.inputs; + + settings = { + trusted-users = lib.mkDefault [ "@wheel" ]; + extra-experimental-features = lib.mkDefault [ + "nix-command" + "flakes" + ]; + auto-optimise-store = lib.mkDefault true; + }; + }; + + sops = { + age = { + sshKeyPaths = lib.mkDefault [ "/etc/ssh/ssh_host_ed25519_key" ]; + keyFile = lib.mkDefault "/var/lib/sops-nix/key.txt"; + generateKey = lib.mkDefault true; + }; + }; + + # TODO: for each non-system user on the machine? + # home-manager = { + # + # useGlobalPkgs = lib.mkDefault true; + # backupFileExtension = lib.mkDefault "hm-backup"; + + # sharedModules = with self.outputs.homeManagerModules; [ + # default + # ]; + + # users = { + # root = { + # home.stateVersion = lib.mkDefault config.system.stateVersion; + # # imports = with self.outputs.homeManagerModules; [ + # # ]; + # }; + # daniel = { + # home.stateVersion = lib.mkDefault config.system.stateVersion; + # imports = with self.outputs.homeManagerModules; [ + # daniel + # ]; + # }; + # }; + # }; + + systemd.services.nix-daemon.environment.TMPDIR = lib.mkDefault "/var/tmp"; # TODO: why did I do this again? + boot.tmp.cleanOnBoot = lib.mkDefault true; + programs.gnupg.agent.enable = lib.mkDefault true; + time.timeZone = lib.mkDefault "America/Chicago"; + i18n.defaultLocale = lib.mkDefault "en_US.UTF-8"; + hardware.enableRedistributableFirmware = lib.mkDefault true; + + users.users.root = { + openssh.authorizedKeys.keys = lib.mkDefault [ self.outputs.pubkey ]; + }; + + services = { + openssh = { + enable = lib.mkDefault true; + + settings = { + PasswordAuthentication = lib.mkDefault false; + KbdInteractiveAuthentication = lib.mkDefault false; + PermitRootLogin = lib.mkForce "prohibit-password"; + }; + + openFirewall = lib.mkDefault true; + + /* + listenAddresses = [ + { addr = "0.0.0.0"; port = 22; } + ]; + */ + }; + avahi = { + enable = lib.mkDefault true; + reflector = lib.mkDefault true; + openFirewall = lib.mkDefault true; + nssmdns4 = lib.mkDefault true; + }; + tailscale = { + enable = lib.mkDefault true; + useRoutingFeatures = lib.mkDefault "client"; + }; + journald.extraConfig = lib.mkDefault "SystemMaxUse=1G"; + xserver.xkb = { + layout = lib.mkDefault "us"; + + # have the caps-lock key instead be a ctrl key + options = lib.mkDefault "ctrl:nocaps"; + }; + smartd.enable = lib.mkDefault true; + fwupd.enable = lib.mkDefault true; + }; + + console = { + useXkbConfig = lib.mkDefault true; + earlySetup = lib.mkDefault true; + + colors = + with self.outputs.style.colors; + lib.mkDefault [ + bg + red + green + orange + blue + purple + yellow + fg3 + fgdim + red + green + orange + blue + purple + yellow + fg + ]; + }; + + networking = { + hostName = lib.mkDefault "set-a-hostname-dingus"; + + useDHCP = lib.mkDefault true; + firewall = { + enable = lib.mkDefault true; + allowPing = lib.mkDefault true; + }; + }; + + users.groups.daniel = { }; + users.users.daniel = { + isNormalUser = true; + home = "/home/daniel/.home"; + description = "Daniel Flanagan"; + createHome = true; + openssh.authorizedKeys.keys = [ self.outputs.pubkey ]; + group = "daniel"; + extraGroups = [ + "users" + "wheel" + "video" + "dialout" + "uucp" + "kvm" + ]; + packages = [ ]; + }; + }; +} diff --git a/lib/modules/nixos/default.nix b/lib/modules/nixos/default.nix index 2951afc..7b7fcf3 100644 --- a/lib/modules/nixos/default.nix +++ b/lib/modules/nixos/default.nix @@ -1,42 +1,31 @@ -{ self, ... }: -let - inherit (self) outputs; - inherit (outputs) - nixosModules - # overlays - pubkey - ; -in -{ - common = { - imports = with nixosModules; [ - deno-netlify-ddns-client - shell-defaults-and-applications - desktop - wifi - printing - podman - virtual-machines - postgres - gaming - gnome - daniel - root - ]; - }; - - nix-config = (import ../../../flake.nix).nixConfig; - shell-defaults-and-applications = import ./shell-config.nix; - deno-netlify-ddns-client = import ./deno-netlify-ddns-client.nix; - +inputs: { # boot.tmp.useTmpfs = true; # boot.uki.tries = 3; # services.irqbalance.enable = true; + nix-config = (import ../../../flake.nix).nixConfig; + + default = import ./default-module.nix inputs; + shell-defaults-and-applications = import ./shell-config.nix; + deno-netlify-ddns-client = import ./deno-netlify-ddns-client.nix; + gnome = import ./gnome.nix; + laptop = import ./laptop.nix; + plasma6 = import ./plasma.nix; + lutris = import ./lutris.nix; + gaming = import ./gaming.nix; + pipewire = import ./pipewire.nix; + podman = import ./podman.nix; + virtual-machines = import ./virtual-machines.nix; + postgres = import ./postgres.nix; + desktop = import ./desktop.nix; + printing = import ./printing.nix; + wifi = import ./wifi.nix; + steam = import ./steam.nix; + remote-disk-key-entry-on-boot = { - lib, - pkgs, + # lib, + # pkgs, ... }: { @@ -54,99 +43,13 @@ in ssh = { enable = true; port = 22; - authorizedKeys = [ pubkey ]; + authorizedKeys = [ inputs.self.outputs.pubkey ]; hostKeys = [ "/etc/secrets/initrd/ssh_host_rsa_key" ]; }; }; }; }; - laptop = - # TODO: modularize - { pkgs, ... }: - { - environment.systemPackages = with pkgs; [ - acpi - ]; - - services.udev.extraRules = '' - ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chgrp video /sys/class/backlight/%k/brightness" - ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chmod g+w /sys/class/backlight/%k/brightness" - ''; - - services.upower.enable = true; - - # NOTE: I previously let plasma settings handle this - services.logind = { - lidSwitch = "suspend-then-hibernate"; - extraConfig = '' - KillUserProcesses=no - HandlePowerKey=suspend - HandlePowerKeyLongPress=poweroff - HandleRebootKey=reboot - HandleRebootKeyLongPress=poweroff - HandleSuspendKey=suspend - HandleSuspendKeyLongPress=hibernate - HandleHibernateKey=hibernate - HandleHibernateKeyLongPress=ignore - HandleLidSwitch=suspend - HandleLidSwitchExternalPower=suspend - HandleLidSwitchDocked=suspend - HandleLidSwitchDocked=suspend - IdleActionSec=11m - IdleAction=ignore - ''; - }; - }; - - gnome = - { - pkgs, - lib, - config, - ... - }: - { - config = lib.mkIf config.services.xserver.desktopManager.gnome.enable { - - services = { - xserver = { - enable = true; - displayManager.gdm.enable = true; - # desktopManager.gnome.enable = true; - }; - udev.packages = [ pkgs.gnome-settings-daemon ]; - }; - - environment = { - variables.GSK_RENDERER = "gl"; - systemPackages = with pkgs; [ - bitwarden - # adwaita-gtk-theme - papirus-icon-theme - adwaita-icon-theme - adwaita-icon-theme-legacy - hydrapaper - ]; - }; - - programs.kdeconnect = { - enable = true; - package = pkgs.gnomeExtensions.gsconnect; - }; - - networking.firewall = rec { - allowedTCPPortRanges = [ - { - from = 1714; - to = 1764; - } - ]; - allowedUDPPortRanges = allowedTCPPortRanges; - }; - }; - }; - radio-tools = { pkgs, ... }: { @@ -156,566 +59,4 @@ in ]; }; }; - - kde-connect = { - programs.kdeconnect.enable = true; - - /* - # handled by enabling - networking.firewall = { - allowedTCPPortRanges = [ { from = 1714; to = 1764; } ]; - allowedUDPPortRanges = [ { from = 1714; to = 1764; } ]; - }; - */ - }; - - fonts = - { pkgs, ... }: - { - fonts.packages = [ - ( - # allow nixpkgs 24.11 and unstable to both work - if builtins.hasAttr "nerd-fonts" pkgs then - (pkgs.nerd-fonts.symbols-only) - else - (pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; }) - ) - pkgs.iosevkaLyteTerm - ]; - }; - - plasma6 = - { - pkgs, - lib, - ... - }: - { - imports = with nixosModules; [ - kde-connect - pipewire - ]; - - services.xserver.enable = true; - - services.displayManager.sddm = { - enable = true; - # package = lib.mkForce pkgs.kdePackages.sddm; - settings = { }; - # theme = ""; - enableHidpi = true; - wayland = { - enable = true; - compositor = "weston"; - }; - }; - - services.desktopManager.plasma6.enable = true; - programs.dconf.enable = true; - - services.xrdp.enable = false; - services.xrdp.defaultWindowManager = "plasma"; - services.xrdp.openFirewall = false; - - environment.systemPackages = with pkgs; [ - wl-clipboard - inkscape - krita - noto-fonts - vlc - wl-clipboard - - kdePackages.qtvirtualkeyboard - maliit-keyboard - maliit-framework - - kdePackages.kate - kdePackages.kcalc - kdePackages.filelight - kdePackages.krdc - kdePackages.krfb - kdePackages.kclock - kdePackages.kweather - kdePackages.ktorrent - kdePackages.kdeplasma-addons - - unstable-packages.kdePackages.krdp - - /* - kdePackages.kdenlive - kdePackages.merkuro - kdePackages.neochat - kdePackages.kdevelop - kdePackages.kdialog - */ - ]; - - programs.gnupg.agent.pinentryPackage = lib.mkForce pkgs.pinentry-qt; - }; - - lutris = - { pkgs, ... }: - { - environment = { - systemPackages = with pkgs; [ - wineWowPackages.waylandFull - lutris - winetricks - ]; - }; - }; - - gaming = - { pkgs, ... }: - { - imports = with nixosModules; [ - lutris # TODO: use the flatpak? - steam # TODO: use the flatpak? - ]; - - environment = { - systemPackages = with pkgs; [ - ludusavi - # ludusavi uses rclone - rclone - ]; - }; - }; - - pipewire = { - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - jack.enable = true; - # wireplumber.enable = true; # this is default now - wireplumber.extraConfig = { - "monitor.bluez.properties" = { - "bluez5.enable-sbc-xq" = true; - "bluez5.enable-msbc" = true; - "bluez5.enable-hw-volume" = true; - "bluez5.roles" = [ - "hsp_hs" - "hsp_ag" - "hfp_hf" - "hfp_ag" - ]; - }; - }; - extraConfig.pipewire."91-null-sinks" = { - "context.objects" = [ - { - # A default dummy driver. This handles nodes marked with the "node.always-driver" - # properyty when no other driver is currently active. JACK clients need this. - factory = "spa-node-factory"; - args = { - "factory.name" = "support.node.driver"; - "node.name" = "Dummy-Driver"; - "priority.driver" = 8000; - }; - } - { - factory = "adapter"; - args = { - "factory.name" = "support.null-audio-sink"; - "node.name" = "Microphone-Proxy"; - "node.description" = "Microphone"; - "media.class" = "Audio/Source/Virtual"; - "audio.position" = "MONO"; - }; - } - { - factory = "adapter"; - args = { - "factory.name" = "support.null-audio-sink"; - "node.name" = "Main-Output-Proxy"; - "node.description" = "Main Output"; - "media.class" = "Audio/Sink"; - "audio.position" = "FL,FR"; - }; - } - ]; - }; - /* - extraConfig.pipewire."92-low-latency" = { - context.properties = { - default.clock.rate = 48000; - default.clock.quantum = 32; - default.clock.min-quantum = 32; - default.clock.max-quantum = 32; - }; - }; - */ - }; - - # recommended by https://nixos.wiki/wiki/PipeWire - security.rtkit.enable = true; - - /* - services.pipewire = { - enable = true; - - wireplumber.enable = true; - pulse.enable = true; - jack.enable = true; - - alsa = { - enable = true; - support32Bit = true; - }; - }; - - hardware = { - pulseaudio = { - enable = false; - support32Bit = true; - }; - }; - - security = { - # I forget why I need these exactly... - polkit.enable = true; - - rtkit.enable = true; - }; - */ - }; - - podman = - { - pkgs, - config, - lib, - ... - }: - { - config = lib.mkIf config.virtualisation.podman.enable { - environment = { - systemPackages = with pkgs; [ - podman-compose - ]; - }; - - virtualisation = { - podman = { - dockerCompat = config.virtualisation.podman.enable; - dockerSocket.enable = true; - defaultNetwork.settings.dns_enabled = true; - }; - - oci-containers = { - backend = "podman"; - }; - }; - - networking = { - extraHosts = '' - 127.0.0.1 host.docker.internal - ::1 host.docker.internal - 127.0.0.1 host.containers.internal - ::1 host.containers.internal - ''; - }; - }; - }; - - virtual-machines = - { - lib, - config, - ... - }: - { - config = lib.mkIf config.virtualisation.libvirtd.enable { - users.users.daniel.extraGroups = [ "libvirtd" ]; - }; - }; - - postgres = - { - pkgs, - lib, - config, - ... - }: - { - config = lib.mkIf config.services.postgresql.enable { - # this is really just for development usage - services.postgresql = { - ensureDatabases = [ "daniel" ]; - ensureUsers = [ - { - name = "daniel"; - ensureDBOwnership = true; - } - ]; - # enableTCPIP = true; - # package = pkgs.postgresql_15; - - authentication = pkgs.lib.mkOverride 10 '' - #type database DBuser auth-method - local all postgres peer map=superuser_map - local all daniel peer map=superuser_map - local sameuser all peer map=superuser_map - - # lan ipv4 - host all all 10.0.0.0/24 trust - host all all 127.0.0.1/32 trust - - # tailnet ipv4 - host all all 100.64.0.0/10 trust - ''; - - identMap = '' - # ArbitraryMapName systemUser DBUser - superuser_map root postgres - superuser_map postgres postgres - superuser_map daniel postgres - - superuser_map /^(.*)$ \1 # Let other names login as themselves - ''; - }; - - environment.systemPackages = with pkgs; [ - pgcli - ]; - }; - }; - - desktop = - { - pkgs, - lib, - config, - options, - ... - }: - let - cfg = config.lyte.desktop; - in - { - options = { - lyte = { - desktop = { - enable = lib.mkEnableOption "Enable my default desktop configuration and applications"; - }; - }; - }; - config = lib.mkIf cfg.enable { - # services.xserver.desktopManager.gnome.enable = true; - - xdg.portal.enable = true; - - hardware = - if builtins.hasAttr "graphics" options.hardware then - { - graphics = { - enable = true; - # enable32Bit = true; - /* - driSupport32Bit = true; - driSupport = true; - */ - }; - } - else - { - opengl = { - enable = true; - # driSupport32Bit = true; - driSupport = true; - }; - }; - fonts.packages = [ - ( - # allow nixpkgs 24.11 and unstable to both work - if builtins.hasAttr "nerd-fonts" pkgs then - (pkgs.nerd-fonts.symbols-only) - else - (pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; }) - ) - pkgs.iosevkaLyteTerm - ]; - services.flatpak.enable = true; - programs.appimage.binfmt = true; - services.printing.enable = true; - programs.virt-manager.enable = config.virtualisation.libvirtd.enable; - }; - }; - - printing = - { - pkgs, - lib, - config, - ... - }: - { - config = lib.mkIf config.services.printing.enable { - services.printing.browsing = true; - services.printing.browsedConf = '' - BrowseDNSSDSubTypes _cups,_print - BrowseLocalProtocols all - BrowseRemoteProtocols all - CreateIPPPrinterQueues All - - BrowseProtocols all - ''; - services.printing.drivers = [ pkgs.gutenprint ]; - }; - }; - - wifi = - { - lib, - config, - ... - }: - let - inherit (lib) mkDefault; - cfg = config.networking.wifi; - in - { - options = { - networking.wifi.enable = lib.mkEnableOption "Enable wifi via NetworkManager"; - }; - config = lib.mkIf cfg.enable { - networking.networkmanager = { - enable = true; - # ensureProfiles = { - # profiles = { - # home-wifi = { - # id="home-wifi"; - # permissions = ""; - # type = "wifi"; - # }; - # wifi = { - # ssid = ""; - # }; - # wifi-security = { - # # auth-alg = ""; - # # key-mgmt = ""; - # psk = ""; - # }; - # }; - # }; - }; - systemd.services.NetworkManager-wait-online.enable = mkDefault false; - - /* - TODO: networking.networkmanager.wifi.backend = "iwd"; ? - TODO: powersave? - TODO: can I pre-configure my usual wifi networks with SSIDs and PSKs loaded from secrets? - */ - hardware.wirelessRegulatoryDatabase = true; - boot.extraModprobeConfig = '' - options cfg80211 ieee80211_regdom="US" - ''; - }; - }; - - steam = - { pkgs, options, ... }: - { - programs.gamescope.enable = true; - - services.pipewire = { - alsa.support32Bit = true; - }; - - programs.steam = { - enable = true; - - extest.enable = true; - gamescopeSession.enable = true; - - extraPackages = with pkgs; [ - gamescope - ]; - - extraCompatPackages = with pkgs; [ - proton-ge-bin - ]; - - localNetworkGameTransfers.openFirewall = true; - remotePlay.openFirewall = true; - }; - - hardware = - ( - if builtins.hasAttr "graphics" options.hardware then - { - graphics = { - enable = true; - enable32Bit = true; - }; - } - else - { - opengl = { - enable = true; - driSupport32Bit = true; - }; - } - ) - // { - steam-hardware.enable = true; - }; - - services.udev.packages = with pkgs; [ steam ]; - - environment.systemPackages = with pkgs; [ - dualsensectl # for interfacing with dualsense controllers programmatically - ]; - - # remote play ports - should be unnecessary due to programs.steam.remotePlay.openFirewall = true; - /* - networking.firewall.allowedUDPPortRanges = [ { from = 27031; to = 27036; } ]; - networking.firewall.allowedTCPPortRanges = [ { from = 27036; to = 27037; } ]; - */ - }; - - root = - { - pkgs, - lib, - ... - }: - { - users.users.root = { - home = "/root"; - createHome = true; - openssh.authorizedKeys.keys = [ pubkey ]; - shell = lib.mkForce pkgs.fish; - }; - }; - - daniel = - { - pkgs, - lib, - config, - ... - }: - { - users.groups.daniel = { }; - users.users.daniel = { - isNormalUser = true; - home = "/home/daniel/.home"; - description = "Daniel Flanagan"; - createHome = true; - openssh.authorizedKeys.keys = [ pubkey ]; - group = "daniel"; - extraGroups = [ - "users" - "wheel" - "video" - "dialout" - "uucp" - "kvm" - ]; - packages = [ ]; - }; - }; } diff --git a/lib/modules/nixos/desktop.nix b/lib/modules/nixos/desktop.nix new file mode 100644 index 0000000..e3e9dec --- /dev/null +++ b/lib/modules/nixos/desktop.nix @@ -0,0 +1,64 @@ +{ + pkgs, + lib, + config, + options, + ... +}: +let + cfg = config.lyte.desktop; +in +{ + imports = with nixosModules; [ + gnome + ]; + options = { + lyte = { + desktop = { + enable = lib.mkEnableOption "Enable my default desktop configuration and applications"; + }; + }; + }; + config = lib.mkIf cfg.enable { + # services.xserver.desktopManager.gnome.enable = true; + + fonts.packages = [ + ( + # allow nixpkgs 24.11 and unstable to both work + if builtins.hasAttr "nerd-fonts" pkgs then + (pkgs.nerd-fonts.symbols-only) + else + (pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; }) + ) + pkgs.iosevkaLyteTerm + ]; + + xdg.portal.enable = true; + + hardware = + if builtins.hasAttr "graphics" options.hardware then + { + graphics = { + enable = true; + # enable32Bit = true; + /* + driSupport32Bit = true; + driSupport = true; + */ + }; + } + else + { + opengl = { + enable = true; + # driSupport32Bit = true; + driSupport = true; + }; + }; + + services.flatpak.enable = true; + programs.appimage.binfmt = true; + services.printing.enable = true; + programs.virt-manager.enable = config.virtualisation.libvirtd.enable; + }; +} diff --git a/lib/modules/nixos/gaming.nix b/lib/modules/nixos/gaming.nix new file mode 100644 index 0000000..a4cec67 --- /dev/null +++ b/lib/modules/nixos/gaming.nix @@ -0,0 +1,15 @@ +{ self, pkgs, ... }: +{ + imports = with self.outputs.nixosModules; [ + lutris # TODO: use the flatpak? + steam # TODO: use the flatpak? + ]; + + environment = { + systemPackages = with pkgs; [ + ludusavi + # ludusavi uses rclone + rclone + ]; + }; +} diff --git a/lib/modules/nixos/gnome.nix b/lib/modules/nixos/gnome.nix new file mode 100644 index 0000000..9989964 --- /dev/null +++ b/lib/modules/nixos/gnome.nix @@ -0,0 +1,46 @@ +{ + pkgs, + lib, + config, + ... +}: +{ + config = lib.mkIf config.services.xserver.desktopManager.gnome.enable { + + services = { + xserver = { + enable = true; + displayManager.gdm.enable = true; + # desktopManager.gnome.enable = true; + }; + udev.packages = [ pkgs.gnome-settings-daemon ]; + }; + + environment = { + variables.GSK_RENDERER = "gl"; + systemPackages = with pkgs; [ + bitwarden + # adwaita-gtk-theme + papirus-icon-theme + adwaita-icon-theme + adwaita-icon-theme-legacy + hydrapaper + ]; + }; + + programs.kdeconnect = { + enable = true; + package = pkgs.gnomeExtensions.gsconnect; + }; + + networking.firewall = rec { + allowedTCPPortRanges = [ + { + from = 1714; + to = 1764; + } + ]; + allowedUDPPortRanges = allowedTCPPortRanges; + }; + }; +} diff --git a/lib/modules/nixos/laptop.nix b/lib/modules/nixos/laptop.nix new file mode 100644 index 0000000..483518d --- /dev/null +++ b/lib/modules/nixos/laptop.nix @@ -0,0 +1,42 @@ +{ + lib, + config, + pkgs, + ... +}: +{ + config = lib.mkIf config.lyte.laptop.enable { + environment.systemPackages = with pkgs; [ + acpi + ]; + + services.udev.extraRules = '' + ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chgrp video /sys/class/backlight/%k/brightness" + ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chmod g+w /sys/class/backlight/%k/brightness" + ''; + + services.upower.enable = true; + + # NOTE: I previously let plasma settings handle this + services.logind = { + lidSwitch = "suspend-then-hibernate"; + extraConfig = '' + KillUserProcesses=no + HandlePowerKey=suspend + HandlePowerKeyLongPress=poweroff + HandleRebootKey=reboot + HandleRebootKeyLongPress=poweroff + HandleSuspendKey=suspend + HandleSuspendKeyLongPress=hibernate + HandleHibernateKey=hibernate + HandleHibernateKeyLongPress=ignore + HandleLidSwitch=suspend + HandleLidSwitchExternalPower=suspend + HandleLidSwitchDocked=suspend + HandleLidSwitchDocked=suspend + IdleActionSec=11m + IdleAction=ignore + ''; + }; + }; +} diff --git a/lib/modules/nixos/lutris.nix b/lib/modules/nixos/lutris.nix new file mode 100644 index 0000000..98de182 --- /dev/null +++ b/lib/modules/nixos/lutris.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + environment = { + systemPackages = with pkgs; [ + wineWowPackages.waylandFull + lutris + winetricks + ]; + }; +} diff --git a/lib/modules/nixos/pipewire.nix b/lib/modules/nixos/pipewire.nix new file mode 100644 index 0000000..52d0ed3 --- /dev/null +++ b/lib/modules/nixos/pipewire.nix @@ -0,0 +1,99 @@ +{ + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + # wireplumber.enable = true; # this is default now + wireplumber.extraConfig = { + "monitor.bluez.properties" = { + "bluez5.enable-sbc-xq" = true; + "bluez5.enable-msbc" = true; + "bluez5.enable-hw-volume" = true; + "bluez5.roles" = [ + "hsp_hs" + "hsp_ag" + "hfp_hf" + "hfp_ag" + ]; + }; + }; + extraConfig.pipewire."91-null-sinks" = { + "context.objects" = [ + { + # A default dummy driver. This handles nodes marked with the "node.always-driver" + # properyty when no other driver is currently active. JACK clients need this. + factory = "spa-node-factory"; + args = { + "factory.name" = "support.node.driver"; + "node.name" = "Dummy-Driver"; + "priority.driver" = 8000; + }; + } + { + factory = "adapter"; + args = { + "factory.name" = "support.null-audio-sink"; + "node.name" = "Microphone-Proxy"; + "node.description" = "Microphone"; + "media.class" = "Audio/Source/Virtual"; + "audio.position" = "MONO"; + }; + } + { + factory = "adapter"; + args = { + "factory.name" = "support.null-audio-sink"; + "node.name" = "Main-Output-Proxy"; + "node.description" = "Main Output"; + "media.class" = "Audio/Sink"; + "audio.position" = "FL,FR"; + }; + } + ]; + }; + /* + extraConfig.pipewire."92-low-latency" = { + context.properties = { + default.clock.rate = 48000; + default.clock.quantum = 32; + default.clock.min-quantum = 32; + default.clock.max-quantum = 32; + }; + }; + */ + }; + + # recommended by https://nixos.wiki/wiki/PipeWire + security.rtkit.enable = true; + + /* + services.pipewire = { + enable = true; + + wireplumber.enable = true; + pulse.enable = true; + jack.enable = true; + + alsa = { + enable = true; + support32Bit = true; + }; + }; + + hardware = { + pulseaudio = { + enable = false; + support32Bit = true; + }; + }; + + security = { + # I forget why I need these exactly... + polkit.enable = true; + + rtkit.enable = true; + }; + */ +} diff --git a/lib/modules/nixos/plasma.nix b/lib/modules/nixos/plasma.nix new file mode 100644 index 0000000..dbc40f3 --- /dev/null +++ b/lib/modules/nixos/plasma.nix @@ -0,0 +1,68 @@ +{ + self, + pkgs, + lib, + ... +}: +{ + imports = with self.outputs.nixosModules; [ + pipewire + ]; + + programs.kdeconnect.enable = true; + services.xserver.enable = true; + + services.displayManager.sddm = { + enable = true; + # package = lib.mkForce pkgs.kdePackages.sddm; + settings = { }; + # theme = ""; + enableHidpi = true; + wayland = { + enable = true; + compositor = "weston"; + }; + }; + + services.desktopManager.plasma6.enable = true; + programs.dconf.enable = true; + + services.xrdp.enable = false; + services.xrdp.defaultWindowManager = "plasma"; + services.xrdp.openFirewall = false; + + environment.systemPackages = with pkgs; [ + wl-clipboard + inkscape + krita + noto-fonts + vlc + wl-clipboard + + kdePackages.qtvirtualkeyboard + maliit-keyboard + maliit-framework + + kdePackages.kate + kdePackages.kcalc + kdePackages.filelight + kdePackages.krdc + kdePackages.krfb + kdePackages.kclock + kdePackages.kweather + kdePackages.ktorrent + kdePackages.kdeplasma-addons + + unstable-packages.kdePackages.krdp + + /* + kdePackages.kdenlive + kdePackages.merkuro + kdePackages.neochat + kdePackages.kdevelop + kdePackages.kdialog + */ + ]; + + programs.gnupg.agent.pinentryPackage = lib.mkForce pkgs.pinentry-qt; +} diff --git a/lib/modules/nixos/podman.nix b/lib/modules/nixos/podman.nix new file mode 100644 index 0000000..ddab23c --- /dev/null +++ b/lib/modules/nixos/podman.nix @@ -0,0 +1,36 @@ +{ + pkgs, + config, + lib, + ... +}: +{ + config = lib.mkIf config.virtualisation.podman.enable { + environment = { + systemPackages = with pkgs; [ + podman-compose + ]; + }; + + virtualisation = { + podman = { + dockerCompat = config.virtualisation.podman.enable; + dockerSocket.enable = true; + defaultNetwork.settings.dns_enabled = true; + }; + + oci-containers = { + backend = "podman"; + }; + }; + + networking = { + extraHosts = '' + 127.0.0.1 host.docker.internal + ::1 host.docker.internal + 127.0.0.1 host.containers.internal + ::1 host.containers.internal + ''; + }; + }; +} diff --git a/lib/modules/nixos/postgres.nix b/lib/modules/nixos/postgres.nix new file mode 100644 index 0000000..e3e9dec --- /dev/null +++ b/lib/modules/nixos/postgres.nix @@ -0,0 +1,64 @@ +{ + pkgs, + lib, + config, + options, + ... +}: +let + cfg = config.lyte.desktop; +in +{ + imports = with nixosModules; [ + gnome + ]; + options = { + lyte = { + desktop = { + enable = lib.mkEnableOption "Enable my default desktop configuration and applications"; + }; + }; + }; + config = lib.mkIf cfg.enable { + # services.xserver.desktopManager.gnome.enable = true; + + fonts.packages = [ + ( + # allow nixpkgs 24.11 and unstable to both work + if builtins.hasAttr "nerd-fonts" pkgs then + (pkgs.nerd-fonts.symbols-only) + else + (pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; }) + ) + pkgs.iosevkaLyteTerm + ]; + + xdg.portal.enable = true; + + hardware = + if builtins.hasAttr "graphics" options.hardware then + { + graphics = { + enable = true; + # enable32Bit = true; + /* + driSupport32Bit = true; + driSupport = true; + */ + }; + } + else + { + opengl = { + enable = true; + # driSupport32Bit = true; + driSupport = true; + }; + }; + + services.flatpak.enable = true; + programs.appimage.binfmt = true; + services.printing.enable = true; + programs.virt-manager.enable = config.virtualisation.libvirtd.enable; + }; +} diff --git a/lib/modules/nixos/printing.nix b/lib/modules/nixos/printing.nix new file mode 100644 index 0000000..208bc19 --- /dev/null +++ b/lib/modules/nixos/printing.nix @@ -0,0 +1,20 @@ +{ + pkgs, + lib, + config, + ... +}: +{ + config = lib.mkIf config.services.printing.enable { + services.printing.browsing = true; + services.printing.browsedConf = '' + BrowseDNSSDSubTypes _cups,_print + BrowseLocalProtocols all + BrowseRemoteProtocols all + CreateIPPPrinterQueues All + + BrowseProtocols all + ''; + services.printing.drivers = [ pkgs.gutenprint ]; + }; +} diff --git a/lib/modules/nixos/shell-config.nix b/lib/modules/nixos/shell-config.nix index ee007b1..9a43721 100644 --- a/lib/modules/nixos/shell-config.nix +++ b/lib/modules/nixos/shell-config.nix @@ -17,7 +17,11 @@ in }; config = lib.mkIf cfg.enable { - home-manager.users.daniel = { }; + programs.eza = { + enable = true; + }; + + config.lyte.shell.enable = lib.mkDefault true; programs.nix-index.enable = true; programs.command-not-found.enable = false; diff --git a/lib/modules/nixos/steam.nix b/lib/modules/nixos/steam.nix new file mode 100644 index 0000000..c4ea2ad --- /dev/null +++ b/lib/modules/nixos/steam.nix @@ -0,0 +1,65 @@ +{ + config, + lib, + pkgs, + options, + ... +}: +{ + config = lib.mkIf config.programs.steam.enable { + programs.gamescope.enable = true; + + services.pipewire = { + alsa.support32Bit = true; + }; + + programs.steam = { + extest.enable = true; + gamescopeSession.enable = true; + + extraPackages = with pkgs; [ + gamescope + ]; + + extraCompatPackages = with pkgs; [ + proton-ge-bin + ]; + + localNetworkGameTransfers.openFirewall = true; + remotePlay.openFirewall = true; + }; + + hardware = + ( + if builtins.hasAttr "graphics" options.hardware then + { + graphics = { + enable = true; + enable32Bit = true; + }; + } + else + { + opengl = { + enable = true; + driSupport32Bit = true; + }; + } + ) + // { + steam-hardware.enable = true; + }; + + services.udev.packages = with pkgs; [ steam ]; + + environment.systemPackages = with pkgs; [ + dualsensectl # for interfacing with dualsense controllers programmatically + ]; + + # remote play ports - should be unnecessary due to programs.steam.remotePlay.openFirewall = true; + /* + networking.firewall.allowedUDPPortRanges = [ { from = 27031; to = 27036; } ]; + networking.firewall.allowedTCPPortRanges = [ { from = 27036; to = 27037; } ]; + */ + }; +} diff --git a/lib/modules/nixos/virtual-machines.nix b/lib/modules/nixos/virtual-machines.nix new file mode 100644 index 0000000..c7eaa91 --- /dev/null +++ b/lib/modules/nixos/virtual-machines.nix @@ -0,0 +1,10 @@ +{ + lib, + config, + ... +}: +{ + config = lib.mkIf config.virtualisation.libvirtd.enable { + users.users.daniel.extraGroups = [ "libvirtd" ]; + }; +} diff --git a/lib/modules/nixos/wifi.nix b/lib/modules/nixos/wifi.nix new file mode 100644 index 0000000..f60149d --- /dev/null +++ b/lib/modules/nixos/wifi.nix @@ -0,0 +1,47 @@ +{ + lib, + config, + ... +}: +let + inherit (lib) mkDefault; + cfg = config.networking.wifi; +in +{ + options = { + networking.wifi.enable = lib.mkEnableOption "Enable wifi via NetworkManager"; + }; + config = lib.mkIf cfg.enable { + networking.networkmanager = { + enable = true; + # ensureProfiles = { + # profiles = { + # home-wifi = { + # id="home-wifi"; + # permissions = ""; + # type = "wifi"; + # }; + # wifi = { + # ssid = ""; + # }; + # wifi-security = { + # # auth-alg = ""; + # # key-mgmt = ""; + # psk = ""; + # }; + # }; + # }; + }; + systemd.services.NetworkManager-wait-online.enable = mkDefault false; + + /* + TODO: networking.networkmanager.wifi.backend = "iwd"; ? + TODO: powersave? + TODO: can I pre-configure my usual wifi networks with SSIDs and PSKs loaded from secrets? + */ + hardware.wirelessRegulatoryDatabase = true; + boot.extraModprobeConfig = '' + options cfg80211 ieee80211_regdom="US" + ''; + }; +} diff --git a/packages/hosts/beefcake.nix b/packages/hosts/beefcake.nix index 32f3341..02503e8 100644 --- a/packages/hosts/beefcake.nix +++ b/packages/hosts/beefcake.nix @@ -19,7 +19,7 @@ }: { system.stateVersion = "24.05"; - home-manager.users.daniel.home.stateVersion = "24.05"; + # home-manager.users.daniel.home.stateVersion = "24.05"; networking.hostName = "beefcake"; imports = [ diff --git a/packages/hosts/default.nix b/packages/hosts/default.nix index 9420276..030f84a 100644 --- a/packages/hosts/default.nix +++ b/packages/hosts/default.nix @@ -1,15 +1,4 @@ -{ - hardware, - self, - nixpkgs, - sops-nix, - disko, - slippi, - home-manager, - nixpkgs-unstable, - home-manager-unstable, - ... -}: +inputs: let baseHost = { @@ -26,189 +15,25 @@ let (nixpkgs.lib.nixosSystem { inherit system; specialArgs = { - hardware = hardware.outputs.nixosModules; - diskoConfigurations = self.outputs.diskoConfigurations; + inherit home-manager; + hardware = inputs.hardware.outputs.nixosModules; + diskoConfigurations = inputs.self.outputs.diskoConfigurations; }; modules = [ - ( - { - config, - lib, - pkgs, - modulesPath, - ... - }: - { - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - home-manager.nixosModules.home-manager - sops-nix.nixosModules.sops - disko.nixosModules.disko - slippi.nixosModules.default - self.outputs.nixosModules.common - ]; - - config = { - lyte.shell.enable = lib.mkDefault true; - - nixpkgs = { - config.allowUnfree = lib.mkDefault true; - overlays = [ self.flakeLib.forSelfOverlay ]; - }; - - sops = { - age = { - sshKeyPaths = lib.mkDefault [ "/etc/ssh/ssh_host_ed25519_key" ]; - keyFile = lib.mkDefault "/var/lib/sops-nix/key.txt"; - generateKey = lib.mkDefault true; - }; - }; - - # TODO: for each non-system user on the machine? - home-manager = { - extraSpecialArgs = { - config.lyte = config.lyte; - }; - - sharedModules = with self.outputs.homeManagerModules; [ - common - linux - ]; - - users = { - root = { - home.stateVersion = lib.mkDefault config.system.stateVersion; - imports = with self.outputs.homeManagerModules; [ - ]; - }; - daniel = { - home.stateVersion = lib.mkDefault config.system.stateVersion; - imports = with self.outputs.homeManagerModules; [ - daniel - ]; - }; - }; - }; - - nix = { - nixPath = lib.mapAttrsToList (key: value: "${key}=${value.to.path}") config.nix.registry; - # registry = lib.mapAttrs (_: value: { flake = value; }) self.inputs; - - settings = { - trusted-users = lib.mkDefault [ "@wheel" ]; - extra-experimental-features = lib.mkDefault [ - "nix-command" - "flakes" - ]; - auto-optimise-store = lib.mkDefault true; - }; - }; - - systemd.services.nix-daemon.environment.TMPDIR = lib.mkDefault "/var/tmp"; # TODO: why did I do this again? - boot.tmp.cleanOnBoot = lib.mkDefault true; - programs.gnupg.agent.enable = lib.mkDefault true; - time.timeZone = lib.mkDefault "America/Chicago"; - i18n.defaultLocale = lib.mkDefault "en_US.UTF-8"; - hardware.enableRedistributableFirmware = lib.mkDefault true; - - home-manager.useGlobalPkgs = lib.mkDefault true; - home-manager.backupFileExtension = lib.mkDefault "hm-backup"; - - users.users.root = { - openssh.authorizedKeys.keys = lib.mkDefault [ self.outputs.pubkey ]; - }; - - services = { - openssh = { - enable = lib.mkDefault true; - - settings = { - PasswordAuthentication = lib.mkDefault false; - KbdInteractiveAuthentication = lib.mkDefault false; - PermitRootLogin = lib.mkForce "prohibit-password"; - }; - - openFirewall = lib.mkDefault true; - - /* - listenAddresses = [ - { addr = "0.0.0.0"; port = 22; } - ]; - */ - }; - avahi = { - enable = lib.mkDefault true; - reflector = lib.mkDefault true; - openFirewall = lib.mkDefault true; - nssmdns4 = lib.mkDefault true; - }; - tailscale = { - enable = lib.mkDefault true; - useRoutingFeatures = lib.mkDefault "client"; - }; - journald.extraConfig = lib.mkDefault "SystemMaxUse=1G"; - xserver.xkb = { - layout = lib.mkDefault "us"; - - # have the caps-lock key instead be a ctrl key - options = lib.mkDefault "ctrl:nocaps"; - }; - smartd.enable = lib.mkDefault true; - fwupd.enable = lib.mkDefault true; - }; - - console = { - useXkbConfig = lib.mkDefault true; - earlySetup = lib.mkDefault true; - - colors = - with self.outputs.style.colors; - lib.mkDefault [ - bg - red - green - orange - blue - purple - yellow - fg3 - fgdim - red - green - orange - blue - purple - yellow - fg - ]; - }; - - networking = { - hostName = lib.mkDefault "set-a-hostname-dingus"; - - useDHCP = lib.mkDefault true; - firewall = { - enable = lib.mkDefault true; - allowPing = lib.mkDefault true; - }; - }; - }; - } - ) - + inputs.self.outputs.nixosModules.default (import path) ]; }) ) ); - stableHost = baseHost { inherit nixpkgs home-manager; }; + stableHost = baseHost { inherit (inputs) nixpkgs home-manager; }; host = baseHost { - nixpkgs = nixpkgs-unstable; - home-manager = home-manager-unstable; + nixpkgs = inputs.nixpkgs-unstable; + home-manager = inputs.home-manager-unstable; }; in { - # beefcake = stableHost ./beefcake.nix { }; + beefcake = stableHost ./beefcake.nix { }; dragon = host ./dragon.nix { }; # arm-dragon = host ./dragon.nix { system = "aarch64-linux"; }; } diff --git a/packages/hosts/dragon.nix b/packages/hosts/dragon.nix index 6c9ccc6..a7aac48 100644 --- a/packages/hosts/dragon.nix +++ b/packages/hosts/dragon.nix @@ -3,6 +3,7 @@ config, hardware, diskoConfigurations, + homeConfigurations, ... }: { @@ -30,28 +31,30 @@ common-pc-ssd ]; hardware.bluetooth.enable = true; - networking.wifi.enable = true; powerManagement.cpuFreqGovernor = "performance"; - lyte.desktop.enable = true; - sops = { defaultSopsFile = ../../secrets/dragon/secrets.yml; secrets.ddns-pass.mode = "0400"; }; - services.deno-netlify-ddns-client = { - passwordFile = config.sops.secrets.ddns-pass.path; - enable = true; - username = "dragon.h"; - # TODO: router doesn't even do ipv6 yet... - ipv6 = false; - }; + # services.deno-netlify-ddns-client = { + # passwordFile = config.sops.secrets.ddns-pass.path; + # enable = true; + # username = "dragon.h"; + # # TODO: router doesn't even do ipv6 yet... + # ipv6 = false; + # }; - home-manager.users.daniel = { - slippi-launcher = { - enable = true; - isoPath = "${config.users.users.daniel.home}/../games/roms/dolphin/melee.iso"; - launchMeleeOnPlay = false; - }; - }; + # networking.wifi.enable = true; + # lyte.desktop.enable = true; + + # home-manager.users.daniel = { + # lyte.shell.enable = true; + # lyte.desktop.enable = true; + # slippi-launcher = { + # enable = true; + # isoPath = "${config.users.users.daniel.home}/../games/roms/dolphin/melee.iso"; + # launchMeleeOnPlay = false; + # }; + # }; } diff --git a/packages/machines.nix b/packages/machines.nix index 0643ffd..9d2695f 100644 --- a/packages/machines.nix +++ b/packages/machines.nix @@ -1,3 +1,13 @@ +{ + nixpkgs-unstable, + nixpkgs, + self, + ... +}: +let + inherit (self) outputs; + inherit (outputs) nixosModules; +in { beefcake = let