From a45c4551712c1ba5cb82eaf290f311ab0e8690e4 Mon Sep 17 00:00:00 2001 From: Collin Williams <96917990+bluedragon1221@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:40:46 +0000 Subject: big changes --- modules/boot/options.nix | 23 +++ modules/boot/system/default.nix | 37 +++++ modules/boot/system/plymouth.nix | 21 +++ modules/desktop/home/default.nix | 14 ++ .../desktop/home/environments/gnome/default.nix | 67 +++++++++ .../desktop/home/environments/hyprland/default.nix | 14 ++ .../desktop/home/environments/hyprland/dunst.nix | 44 ++++++ .../desktop/home/environments/hyprland/fuzzel.nix | 44 ++++++ .../environments/hyprland/hyprland/catppuccin.conf | 79 ++++++++++ .../environments/hyprland/hyprland/default.nix | 96 ++++++++++++ .../environments/hyprland/hyprland/wallpaper.jpg | Bin 0 -> 169046 bytes .../environments/hyprland/waybar/catppuccin.scss | 26 ++++ .../home/environments/hyprland/waybar/config.nix | 59 ++++++++ .../home/environments/hyprland/waybar/default.nix | 20 +++ .../environments/hyprland/waybar/power_menu.xml | 23 +++ .../home/environments/hyprland/waybar/style.scss | 86 +++++++++++ modules/desktop/home/gtk/adwaita.nix | 33 +++++ modules/desktop/home/gtk/catppuccin.nix | 33 +++++ modules/desktop/home/gtk/default.nix | 26 ++++ modules/desktop/home/programs/firefox/adwaita.nix | 25 ++++ .../desktop/home/programs/firefox/catppuccin.nix | 20 +++ modules/desktop/home/programs/firefox/default.nix | 17 +++ modules/desktop/home/programs/firefox/profile.nix | 38 +++++ modules/desktop/home/programs/musescore.nix | 13 ++ modules/desktop/options.nix | 67 +++++++++ modules/desktop/system/components/dunst.nix | 38 +++++ modules/desktop/system/components/fuzzel.nix | 50 +++++++ modules/desktop/system/default.nix | 12 ++ modules/desktop/system/environments/gnome.nix | 67 +++++++++ modules/desktop/system/environments/sway.nix | 103 +++++++++++++ modules/desktop/system/programs/firefox.nix | 36 +++++ modules/desktop/system/programs/foot.nix | 64 ++++++++ modules/nix/system/default.nix | 23 +++ modules/options.nix | 9 ++ modules/services/options.nix | 20 +++ modules/services/system/audio.nix | 19 +++ modules/services/system/bluetooth.nix | 16 ++ modules/services/system/default.nix | 7 + modules/services/system/networking/default.nix | 19 +++ modules/services/system/networking/iwd.nix | 26 ++++ modules/services/system/networking/nm.nix | 15 ++ modules/terminal/home/default.nix | 5 + modules/terminal/home/emulators/blackbox.nix | 30 ++++ modules/terminal/options.nix | 77 ++++++++++ modules/terminal/system/default.nix | 25 ++++ modules/terminal/system/programs/cmus.nix | 83 +++++++++++ modules/terminal/system/programs/fish.nix | 57 +++++++ modules/terminal/system/programs/git.nix | 29 ++++ modules/terminal/system/programs/helix.nix | 139 +++++++++++++++++ modules/terminal/system/programs/lazygit.nix | 26 ++++ modules/terminal/system/programs/starship.nix | 48 ++++++ modules/terminal/system/programs/tmux.nix | 164 +++++++++++++++++++++ modules/user/home/default.nix | 3 + modules/user/options.nix | 23 +++ modules/user/system/default.nix | 25 ++++ 55 files changed, 2183 insertions(+) create mode 100644 modules/boot/options.nix create mode 100644 modules/boot/system/default.nix create mode 100644 modules/boot/system/plymouth.nix create mode 100644 modules/desktop/home/default.nix create mode 100644 modules/desktop/home/environments/gnome/default.nix create mode 100644 modules/desktop/home/environments/hyprland/default.nix create mode 100644 modules/desktop/home/environments/hyprland/dunst.nix create mode 100644 modules/desktop/home/environments/hyprland/fuzzel.nix create mode 100644 modules/desktop/home/environments/hyprland/hyprland/catppuccin.conf create mode 100644 modules/desktop/home/environments/hyprland/hyprland/default.nix create mode 100644 modules/desktop/home/environments/hyprland/hyprland/wallpaper.jpg create mode 100644 modules/desktop/home/environments/hyprland/waybar/catppuccin.scss create mode 100644 modules/desktop/home/environments/hyprland/waybar/config.nix create mode 100644 modules/desktop/home/environments/hyprland/waybar/default.nix create mode 100644 modules/desktop/home/environments/hyprland/waybar/power_menu.xml create mode 100644 modules/desktop/home/environments/hyprland/waybar/style.scss create mode 100644 modules/desktop/home/gtk/adwaita.nix create mode 100644 modules/desktop/home/gtk/catppuccin.nix create mode 100644 modules/desktop/home/gtk/default.nix create mode 100644 modules/desktop/home/programs/firefox/adwaita.nix create mode 100644 modules/desktop/home/programs/firefox/catppuccin.nix create mode 100644 modules/desktop/home/programs/firefox/default.nix create mode 100644 modules/desktop/home/programs/firefox/profile.nix create mode 100644 modules/desktop/home/programs/musescore.nix create mode 100644 modules/desktop/options.nix create mode 100644 modules/desktop/system/components/dunst.nix create mode 100644 modules/desktop/system/components/fuzzel.nix create mode 100644 modules/desktop/system/default.nix create mode 100644 modules/desktop/system/environments/gnome.nix create mode 100644 modules/desktop/system/environments/sway.nix create mode 100644 modules/desktop/system/programs/firefox.nix create mode 100644 modules/desktop/system/programs/foot.nix create mode 100644 modules/nix/system/default.nix create mode 100644 modules/options.nix create mode 100644 modules/services/options.nix create mode 100644 modules/services/system/audio.nix create mode 100644 modules/services/system/bluetooth.nix create mode 100644 modules/services/system/default.nix create mode 100644 modules/services/system/networking/default.nix create mode 100644 modules/services/system/networking/iwd.nix create mode 100644 modules/services/system/networking/nm.nix create mode 100644 modules/terminal/home/default.nix create mode 100644 modules/terminal/home/emulators/blackbox.nix create mode 100644 modules/terminal/options.nix create mode 100644 modules/terminal/system/default.nix create mode 100644 modules/terminal/system/programs/cmus.nix create mode 100644 modules/terminal/system/programs/fish.nix create mode 100644 modules/terminal/system/programs/git.nix create mode 100644 modules/terminal/system/programs/helix.nix create mode 100644 modules/terminal/system/programs/lazygit.nix create mode 100644 modules/terminal/system/programs/starship.nix create mode 100644 modules/terminal/system/programs/tmux.nix create mode 100644 modules/user/home/default.nix create mode 100644 modules/user/options.nix create mode 100644 modules/user/system/default.nix (limited to 'modules') diff --git a/modules/boot/options.nix b/modules/boot/options.nix new file mode 100644 index 0000000..c040032 --- /dev/null +++ b/modules/boot/options.nix @@ -0,0 +1,23 @@ +{ + config, + lib, + ... +}: let + inherit (lib) mkOption mkEnableOption types; +in { + options = { + collinux.boot = { + bootloader = mkOption { + type = types.enum ["grub" "systemd-boot"]; + }; + plymouth = { + enable = mkEnableOption "plymouth bootsplash"; + theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + default = config.collinux.theme; + }; + }; + secureBoot.enable = mkEnableOption "lanzaboote"; + }; + }; +} diff --git a/modules/boot/system/default.nix b/modules/boot/system/default.nix new file mode 100644 index 0000000..e32601c --- /dev/null +++ b/modules/boot/system/default.nix @@ -0,0 +1,37 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.boot; +in { + imports = [ + ./plymouth.nix + ]; + + boot = + { + initrd = { + verbose = false; + systemd.enable = true; + }; + loader = { + systemd-boot = lib.optionalAttrs (cfg.bootloader == "systemd-boot" && !cfg.secureBoot.enable) { + enable = true; + configurationLimit = 3; + }; + grub = lib.optionalAttrs (cfg.bootloader == "grub") {enable = true;}; + efi.canTouchEfiVariables = true; + timeout = 0; + }; + } + // (lib.optionalAttrs cfg.secureBoot.enable { + lanzaboote = { + enable = true; + pkiBundle = "/var/lib/sbctl"; + }; + }); + + environment.systemPackages = lib.mkIf cfg.secureBoot.enable [pkgs.sbctl]; +} diff --git a/modules/boot/system/plymouth.nix b/modules/boot/system/plymouth.nix new file mode 100644 index 0000000..5f7952b --- /dev/null +++ b/modules/boot/system/plymouth.nix @@ -0,0 +1,21 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.boot.plymouth; +in + lib.mkIf cfg.enable { + boot.plymouth = { + enable = true; + theme = + if (cfg.theme == "catppuccin") + then "catppuccin-macchiato" # for whatever reason catppuccin-mocha has errors + else "nixos-bgrt"; + themePackages = + if (cfg.theme == "catppuccin") + then [pkgs.catppuccin-plymouth] + else [pkgs.nixos-bgrt-plymouth]; + }; + } diff --git a/modules/desktop/home/default.nix b/modules/desktop/home/default.nix new file mode 100644 index 0000000..47d8687 --- /dev/null +++ b/modules/desktop/home/default.nix @@ -0,0 +1,14 @@ +let + findPrograms = + builtins.attrValues + (builtins.mapAttrs + (file: type: ./programs/${file}) + (builtins.readDir ./programs)); +in { + imports = + [ + ./environments/gnome + ./gtk + ] + ++ findPrograms; +} diff --git a/modules/desktop/home/environments/gnome/default.nix b/modules/desktop/home/environments/gnome/default.nix new file mode 100644 index 0000000..9b248ea --- /dev/null +++ b/modules/desktop/home/environments/gnome/default.nix @@ -0,0 +1,67 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.desktop.gnome; +in + lib.mkIf cfg.enable { + home.packages = with pkgs.gnomeExtensions; [ + blur-my-shell + dash-to-dock + ]; + + dconf = { + enable = true; + settings = { + "org/gnome/mutter" = { + workspaces-only-on-primary = false; + }; + "org/gnome/shell/app-switcher" = { + current-workspace-only = true; + }; + + # Idle settings + "org/gnome/desktop/session" = { + idle-delay = 0; + }; + "org/gnome/settings-daemon/plugins/power" = { + sleep-inactive-ac-type = "nothing"; + }; + + # Keybindings + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = { + binding = "Return"; + command = "blackbox"; + name = "Terminal"; + }; + "org/gnome/settings-daemon/plugins/media-keys" = { + custom-keybindings = [ + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/" + ]; + }; + + # Background + "org/gnome/desktop/background" = rec { + picture-uri = "file://${pkgs.gnome-backgrounds}/share/backgrounds/gnome/blobs-d.svg"; + picture-uri-dark = picture-uri; + }; + + # Extensions + "org/gnome/shell" = { + disable-user-extensions = false; + enabled-extensions = with pkgs.gnomeExtensions; [ + blur-my-shell.extensionUuid + dash-to-dock.extensionUuid + ]; + }; + + "org/gnome/shell/extensions/dash-to-dock" = { + dash-max-icon-size = 48; + show-trash = false; + show-mounts = false; + }; + }; + }; + } diff --git a/modules/desktop/home/environments/hyprland/default.nix b/modules/desktop/home/environments/hyprland/default.nix new file mode 100644 index 0000000..85abeaa --- /dev/null +++ b/modules/desktop/home/environments/hyprland/default.nix @@ -0,0 +1,14 @@ +{ + config, + lib, + ... +}: let + cfg = config.collinux.desktop.hyprland; +in { + imports = [ + ./hyprland + ./dunst.nix + ./fuzzel.nix + ./waybar + ]; +} diff --git a/modules/desktop/home/environments/hyprland/dunst.nix b/modules/desktop/home/environments/hyprland/dunst.nix new file mode 100644 index 0000000..6a5a0d1 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/dunst.nix @@ -0,0 +1,44 @@ +{ + config, + lib, + ... +}: let + cfg = config.collinux.desktop.hyprland.components.dunst; +in + lib.mkIf cfg.enable { + services.dunst = { + enable = true; + settings = lib.mkMerge [ + { + global = { + offset = "8x30"; + origin = "top-right"; + transparency = 10; + font = "Iosevka Nerd Font"; + }; + } + (lib.mkIf (cfg.theme == "catppuccin") { + global = { + frame_color = "#89b4fa"; + highlight = "#89b4fa"; + }; + + urgency_low = { + background = "#1e1e2e"; + foreground = "#cdd6f4"; + }; + + urgency_normal = { + background = "#1e1e2e"; + foreground = "#cdd6f4"; + }; + + urgency_critical = { + background = "#1e1e2e"; + foreground = "#cdd6f4"; + frame_color = "#fab387"; + }; + }) + ]; + }; + } diff --git a/modules/desktop/home/environments/hyprland/fuzzel.nix b/modules/desktop/home/environments/hyprland/fuzzel.nix new file mode 100644 index 0000000..6dca3fb --- /dev/null +++ b/modules/desktop/home/environments/hyprland/fuzzel.nix @@ -0,0 +1,44 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.desktop.hyprland.components.fuzzel; +in + lib.mkIf cfg.enable { + programs.fuzzel = { + enable = true; + settings = { + main = { + prompt = " "; + dpi-aware = false; + + font = "Iosevka Nerd Font"; + line-height = 25; + lines = 10; + width = 30; + + horizontal-pad = 8; + vertical-pad = 8; + }; + border = { + radius = 0; + width = 2; + }; + + colors = lib.mkIf (cfg.theme == "catppuccin") { + background = "1e1e2edd"; + text = "cdd6f4ff"; + prompt = "bac2deff"; + placeholder = "7f849cff"; + input = "cdd6f4ff"; + match = "89b4faff"; + selection = "585b70ff"; + selection-text = "cdd6f4ff"; + selection-match = "89b4faff"; + counter = "7f849cff"; + border = "89b4faff"; + }; + }; + }; + } diff --git a/modules/desktop/home/environments/hyprland/hyprland/catppuccin.conf b/modules/desktop/home/environments/hyprland/hyprland/catppuccin.conf new file mode 100644 index 0000000..572cb7e --- /dev/null +++ b/modules/desktop/home/environments/hyprland/hyprland/catppuccin.conf @@ -0,0 +1,79 @@ +$rosewater = rgb(f5e0dc) +$rosewaterAlpha = f5e0dc + +$flamingo = rgb(f2cdcd) +$flamingoAlpha = f2cdcd + +$pink = rgb(f5c2e7) +$pinkAlpha = f5c2e7 + +$mauve = rgb(cba6f7) +$mauveAlpha = cba6f7 + +$red = rgb(f38ba8) +$redAlpha = f38ba8 + +$maroon = rgb(eba0ac) +$maroonAlpha = eba0ac + +$peach = rgb(fab387) +$peachAlpha = fab387 + +$yellow = rgb(f9e2af) +$yellowAlpha = f9e2af + +$green = rgb(a6e3a1) +$greenAlpha = a6e3a1 + +$teal = rgb(94e2d5) +$tealAlpha = 94e2d5 + +$sky = rgb(89dceb) +$skyAlpha = 89dceb + +$sapphire = rgb(74c7ec) +$sapphireAlpha = 74c7ec + +$blue = rgb(89b4fa) +$blueAlpha = 89b4fa + +$lavender = rgb(b4befe) +$lavenderAlpha = b4befe + +$text = rgb(cdd6f4) +$textAlpha = cdd6f4 + +$subtext1 = rgb(bac2de) +$subtext1Alpha = bac2de + +$subtext0 = rgb(a6adc8) +$subtext0Alpha = a6adc8 + +$overlay2 = rgb(9399b2) +$overlay2Alpha = 9399b2 + +$overlay1 = rgb(7f849c) +$overlay1Alpha = 7f849c + +$overlay0 = rgb(6c7086) +$overlay0Alpha = 6c7086 + +$surface2 = rgb(585b70) +$surface2Alpha = 585b70 + +$surface1 = rgb(45475a) +$surface1Alpha = 45475a + +$surface0 = rgb(313244) +$surface0Alpha = 313244 + +$base = rgb(1e1e2e) +$baseAlpha = 1e1e2e + +$mantle = rgb(181825) +$mantleAlpha = 181825 + +$crust = rgb(11111b) +$crustAlpha = 11111b + +$accent = $mauve diff --git a/modules/desktop/home/environments/hyprland/hyprland/default.nix b/modules/desktop/home/environments/hyprland/hyprland/default.nix new file mode 100644 index 0000000..1c3c2b8 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/hyprland/default.nix @@ -0,0 +1,96 @@ +{ + config, + pkgs, + lib, + ... +}: let + cfg = config.collinux.desktop.hyprland; +in + lib.mkIf cfg.enable { + home.file."${config.xdg.configHome}/uwsm/env" = lib.mkIf cfg.useUwsm { + text = ''export QT_QPA_PLATFORM=wayland''; + }; + + home.packages = with pkgs; [wl-clipboard hyprshot brightnessctl]; + + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = !cfg.useUwsm; # conflicts with uwsm + + settings = { + source = "${./catppuccin.conf}"; + + xwayland.enabled = false; # all of my apps are compatible with wayland + general = { + "col.active_border" = "$accent"; + "col.inactive_border" = "$base"; + border_size = 2; + gaps_in = 5; + gaps_out = 8; + }; + + # TODO these should be dependent on what applications are enabled + bind = + [ + "Mod4, q, killactive" + "Mod4, x, exec, footclient" + "Mod4, b, exec, firefox" + "Mod4, h, exec, obsidian" + "Mod4, SPACE, exec, fuzzel" + ] + ++ ( + # workspaces + # binds $mod + [shift +] {1..9} to [move to] workspace {1..9} + builtins.concatLists (builtins.genList ( + i: let + ws = i + 1; + in [ + "Mod4, code:1${toString i}, workspace, ${toString ws}" + "Mod4 SHIFT, code:1${toString i}, movetoworkspace, ${toString ws}" + ] + ) + 9) + ); + + binde = [ + ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + + ", XF86MonBrightnessUp, exec, brightnessctl s 5%+" + ", XF86MonBrightnessDown, exec, brightnessctl s 5%-" + ]; + + bindm = [ + "Mod4, mouse:272, movewindow" + "Mod4, mouse:273, resizewindow" + ]; + + monitor = ", prefred, auto, 1"; + animations = { + bezier = [ + "ease, 0.25, 0.1, 0.25, 1" + "menu_decel, 0.1, 1, 0, 1" + ]; + animation = [ + "workspaces, 1, 2, ease" + "workspaces, 1, 7, menu_decel, slidefade 15%" + "global, 1, 2.5, ease" + "windowsIn, 1, 2.75, ease, slide" + "windowsOut, 1.275, ease, slide" + ]; + }; + misc.disable_hyprland_logo = true; + }; + }; + + home.file."Pictures/wallpaper.jpg".source = ./wallpaper.jpg; + + services.hyprpaper = { + enable = true; + settings = { + ipc = false; + preload = ["Pictures/wallpaper.jpg"]; + wallpaper = ",Pictures/wallpaper.jpg"; + }; + }; + } diff --git a/modules/desktop/home/environments/hyprland/hyprland/wallpaper.jpg b/modules/desktop/home/environments/hyprland/hyprland/wallpaper.jpg new file mode 100644 index 0000000..039afcc Binary files /dev/null and b/modules/desktop/home/environments/hyprland/hyprland/wallpaper.jpg differ diff --git a/modules/desktop/home/environments/hyprland/waybar/catppuccin.scss b/modules/desktop/home/environments/hyprland/waybar/catppuccin.scss new file mode 100644 index 0000000..0eb6a82 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/waybar/catppuccin.scss @@ -0,0 +1,26 @@ +@define-color rosewater #f5e0dc; +@define-color flamingo #f2cdcd; +@define-color pink #f5c2e7; +@define-color mauve #cba6f7; +@define-color red #f38ba8; +@define-color maroon #eba0ac; +@define-color peach #fab387; +@define-color yellow #f9e2af; +@define-color green #a6e3a1; +@define-color teal #94e2d5; +@define-color sky #89dceb; +@define-color sapphire #74c7ec; +@define-color blue #89b4fa; +@define-color lavender #b4befe; +@define-color text #cdd6f4; +@define-color subtext1 #bac2de; +@define-color subtext0 #a6adc8; +@define-color overlay2 #9399b2; +@define-color overlay1 #7f849c; +@define-color overlay0 #6c7086; +@define-color surface2 #585b70; +@define-color surface1 #45475a; +@define-color surface0 #313244; +@define-color base #1e1e2e; +@define-color mantle #181825; +@define-color crust #11111b; diff --git a/modules/desktop/home/environments/hyprland/waybar/config.nix b/modules/desktop/home/environments/hyprland/waybar/config.nix new file mode 100644 index 0000000..7afa83c --- /dev/null +++ b/modules/desktop/home/environments/hyprland/waybar/config.nix @@ -0,0 +1,59 @@ +{pkgs, ...}: { + spacing = 4; + modules-left = ["custom/launcher" "hyprland/workspaces"]; + modules-center = ["hyprland/window"]; + modules-right = ["bluetooth" "wireplumber" "battery" "clock" "custom/power"]; + + "custom/launcher" = { + format = " "; + on-click = "${pkgs.fuzzel}/bin/fuzzel"; + }; + "hyprland/workspaces" = { + disable-scroll = true; + all-outputs = true; + warp-on-scroll = false; + format = "{icon}"; + format-icons = { + "1" = ""; + "2" = "󰈹"; + "3" = "󰝚"; + "4" = "󰎚"; + "5" = ""; + }; + }; + "hyprland/window" = { + on-click = "hyprctl dispatch float"; + }; + "bluetooth" = { + format = ""; + format-connected = "󰂯 {device_alias}"; + }; + "battery" = { + format = "{icon} {capacity}%"; + format-alt = "{icon}"; + format-icons = [" " " " " " " " " "]; + }; + "wireplumber" = { + format = "{icon} {volume}%"; + format-alt = "{icon}"; + format-muted = "󰖁 {volume}%"; + format-icons.default = ["󰕿" "󰖀" "󰕾"]; + tooltip = false; + }; + "clock" = { + format = "{:%I:%M}"; + format-alt = "/{:%Y/%b/%d-%a}"; + tooltip = false; + }; + "custom/power" = { + format = " collin"; + tooltip = false; + menu = "on-click"; + menu-file = "${./power_menu.xml}"; + menu-actions = { + logout = "hyprctl dispatch exit"; + reboot = "reboot"; + shutdown = "poweroff"; + }; + }; +} diff --git a/modules/desktop/home/environments/hyprland/waybar/default.nix b/modules/desktop/home/environments/hyprland/waybar/default.nix new file mode 100644 index 0000000..3b73a78 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/waybar/default.nix @@ -0,0 +1,20 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.desktop.hyprland.components.waybar; +in + lib.mkIf cfg.enable { + programs.waybar = { + enable = true; + systemd.enable = true; + settings."mainBar" = import ./config.nix {inherit pkgs;}; + style = lib.mkIf (cfg.theme == "catppuccin") '' + @import "${./catppuccin.scss}"; + + ${builtins.readFile ./style.scss} + ''; + }; + } diff --git a/modules/desktop/home/environments/hyprland/waybar/power_menu.xml b/modules/desktop/home/environments/hyprland/waybar/power_menu.xml new file mode 100644 index 0000000..2935c89 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/waybar/power_menu.xml @@ -0,0 +1,23 @@ + + + + + + Log Out + + + + + + + + Reboot + + + + + Shutdown + + + + diff --git a/modules/desktop/home/environments/hyprland/waybar/style.scss b/modules/desktop/home/environments/hyprland/waybar/style.scss new file mode 100644 index 0000000..7674164 --- /dev/null +++ b/modules/desktop/home/environments/hyprland/waybar/style.scss @@ -0,0 +1,86 @@ +* { + font-family: Iosevka Nerd Font; + font-size: 10pt; + min-height: 0; +} + +#waybar { + background: @base; + color: @text; +} + +#workspaces, +#clock, +#battery, +#wireplumber, +#bluetooth.connected, +#custom-power { + color: @text; + background: @surface0; + + padding: 0.5rem 1rem; + border-radius: 1rem; + + margin: 5px 0; +} + +#workspaces button { + color: @lavender; + border-radius: 1rem; + padding: 0rem 0.75rem; +} + +#workspaces button.active { + color: @sky; +} + +#workspaces button:hover { + box-shadow: inherit; + text-shadow: inherit; + background: none; + border: none; + border-color: transparent; + padding: 0 0.75rem; + margin: 0; +} + +#window { + font-size: 12pt; +} + +#custom-launcher { + color: @blue; + font-size: 12pt; + padding: 0; + margin: 0; + + margin-left: 1rem; + margin-right: 1rem; +} + +#bluetooth.connected { + color: @blue; +} + +#wireplumber { + color: @maroon; + border-radius: 1rem 0 0 1rem; + margin-left: 1rem; +} + +#battery { + color: @green; + border-radius: 0; +} + +#clock { + color: @blue; + border-radius: 0 1rem 1rem 0; + margin-right: 1rem; +} + +#custom-power { + color: @rosewater; + margin-right: 1rem; + /* border: @rosewater 1px solid; */ +} \ No newline at end of file diff --git a/modules/desktop/home/gtk/adwaita.nix b/modules/desktop/home/gtk/adwaita.nix new file mode 100644 index 0000000..1a17d13 --- /dev/null +++ b/modules/desktop/home/gtk/adwaita.nix @@ -0,0 +1,33 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.desktop.gtk; +in + lib.mkIf (cfg.theme == "adwaita") { + home.pointerCursor = { + gtk.enable = true; + dotIcons.enable = false; + + package = pkgs.vanilla-dmz; + name = "Vanilla-DMZ"; + size = 24; + }; + + gtk.theme = { + name = "adw-gtk3"; + package = pkgs.adw-gtk3; + }; + + dconf = { + enable = true; + settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + enable-hot-corners = false; + }; + }; + }; + } diff --git a/modules/desktop/home/gtk/catppuccin.nix b/modules/desktop/home/gtk/catppuccin.nix new file mode 100644 index 0000000..81f0d3d --- /dev/null +++ b/modules/desktop/home/gtk/catppuccin.nix @@ -0,0 +1,33 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.desktop.gtk; +in + lib.mkIf (cfg.theme == "catppuccin") { + home.pointerCursor = { + hyprcursor = { + enable = true; + size = 24; + }; + gtk.enable = true; + dotIcons.enable = false; + + package = pkgs.catppuccin-cursors.mochaDark; + name = "catppuccin-mocha-dark-cursors"; + size = 24; + }; + + gtk = { + theme = { + package = pkgs.catppuccin-gtk.override { + accents = ["blue"]; + variant = "mocha"; + size = "standard"; + }; + name = "catppuccin-mocha-blue-standard"; + }; + }; + } diff --git a/modules/desktop/home/gtk/default.nix b/modules/desktop/home/gtk/default.nix new file mode 100644 index 0000000..8dc00f2 --- /dev/null +++ b/modules/desktop/home/gtk/default.nix @@ -0,0 +1,26 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.gtk; +in { + imports = [ + ./catppuccin.nix + ./adwaita.nix + ]; + + config = { + home.packages = [pkgs.dconf]; + + gtk = { + enable = true; + iconTheme = { + package = pkgs.papirus-icon-theme; + name = "Papirus"; + }; + gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + }; + }; +} diff --git a/modules/desktop/home/programs/firefox/adwaita.nix b/modules/desktop/home/programs/firefox/adwaita.nix new file mode 100644 index 0000000..2655f42 --- /dev/null +++ b/modules/desktop/home/programs/firefox/adwaita.nix @@ -0,0 +1,25 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.desktop.programs.firefox; + + firefox-gnome-theme = builtins.fetchGit { + url = "https://github.com/rafaelmardojai/firefox-gnome-theme"; + rev = "59e3de00f01e5adb851d824cf7911bd90c31083a"; + }; +in + lib.mkIf (cfg.enable && cfg.theme == "adwaita") { + home.file.".mozilla/firefox/${cfg.profileName}/chrome" = { + recursive = true; + source = firefox-gnome-theme; + }; + + programs.firefox.profiles."${cfg.profileName}" = { + settings = { + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + "svg.context-properties.content.enabled" = true; + }; + }; + } diff --git a/modules/desktop/home/programs/firefox/catppuccin.nix b/modules/desktop/home/programs/firefox/catppuccin.nix new file mode 100644 index 0000000..7c78fab --- /dev/null +++ b/modules/desktop/home/programs/firefox/catppuccin.nix @@ -0,0 +1,20 @@ +{ + config, + lib, + ... +}: let + cfg = config.collinux.desktop.programs.firefox; +in + lib.mkIf (cfg.enable && cfg.theme == "catppuccin") { + programs.firefox.profiles."${cfg.profileName}".settings = { + "browser.compactmode.show" = true; + "browser.uidensity" = 1; + + "browser.tabs.inTitlebar" = 0; + "sidebar.verticalTabs" = true; + "sidebar.main.tools" = ""; + + "browser.uiCustomization.state" = ''{"placements":{"widget-overflow-fixed-list":[],"unified-extensions-area":[],"nav-bar":["sidebar-button","customizableui-special-spring4","back-button","forward-button","urlbar-container","ublock0_raymondhill_net-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","unified-extensions-button","vertical-spacer"],"toolbar-menubar":["menubar-items"],"TabsToolbar":[],"vertical-tabs":["tabbrowser-tabs"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","ublock0_raymondhill_net-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action"],"dirtyAreaCache":["nav-bar","TabsToolbar","vertical-tabs","PersonalToolbar","toolbar-menubar","unified-extensions-area"],"currentVersion":21,"newElementCount":6}''; + "browser.uiCustomization.navBarWhenVerticalTabs" = ''["sidebar-button","customizableui-special-spring4","back-button","forward-button","urlbar-container","ublock0_raymondhill_net-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","unified-extensions-button","vertical-spacer"]''; + }; + } diff --git a/modules/desktop/home/programs/firefox/default.nix b/modules/desktop/home/programs/firefox/default.nix new file mode 100644 index 0000000..91230d9 --- /dev/null +++ b/modules/desktop/home/programs/firefox/default.nix @@ -0,0 +1,17 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.desktop.programs.firefox; +in { + imports = [ + ./profile.nix + ./adwaita.nix + ./catppuccin.nix + ]; + + config = lib.mkIf (cfg.enable) { + programs.firefox.enable = true; + }; +} diff --git a/modules/desktop/home/programs/firefox/profile.nix b/modules/desktop/home/programs/firefox/profile.nix new file mode 100644 index 0000000..cab8f40 --- /dev/null +++ b/modules/desktop/home/programs/firefox/profile.nix @@ -0,0 +1,38 @@ +{ + config, + lib, + ... +}: let + cfg = config.collinux.desktop.programs.firefox; +in + lib.mkIf cfg.enable { + programs.firefox.profiles."${cfg.profileName}" = { + isDefault = true; + search.default = "ddg"; + + containersForce = true; + containers = { + "school" = { + color = "orange"; + icon = "briefcase"; + id = 3; + }; + "personal" = { + color = "blue"; + icon = "fingerprint"; + id = 2; + }; + "default" = { + color = "red"; + icon = "circle"; + id = 1; + }; + }; + + settings = { + "browser.aboutConfig.showWarning" = false; + "browser.toolbars.bookmarks.visibility" = "never"; + "browser.urlbar.groupLabels.enabled" = false; + }; + }; + } diff --git a/modules/desktop/home/programs/musescore.nix b/modules/desktop/home/programs/musescore.nix new file mode 100644 index 0000000..5fbf0f5 --- /dev/null +++ b/modules/desktop/home/programs/musescore.nix @@ -0,0 +1,13 @@ +{ + lib, + pkgs, + config, + ... +}: let + cfg = config.collinux.desktop.programs.musescore; +in + lib.mkIf cfg.enable { + home.packages = [pkgs.musescore]; + + # TODO: is there a way to declare a musescore configuration? + } diff --git a/modules/desktop/options.nix b/modules/desktop/options.nix new file mode 100644 index 0000000..0301373 --- /dev/null +++ b/modules/desktop/options.nix @@ -0,0 +1,67 @@ +{ + config, + lib, + ... +}: let + inherit (lib) mkOption mkEnableOption types; + + mkProgramOption' = name: extraOpts: + { + enable = mkEnableOption "whether to enable ${name}"; + theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + default = config.collinux.terminal.theme; + }; + } + // extraOpts; + + mkProgramOption = name: mkProgramOption' name {}; +in { + options = { + collinux.desktop = { + greeter = mkOption { + type = types.enum ["gdm" "greetd"]; + default = let + cfg = config.collinux.desktop; + in + if ((cfg.hyprland.enable || cfg.sway.enable) && !cfg.gnome.enable) + then "greetd" + else "gdm"; + }; + + components = { + waybar = mkProgramOption "waybar"; + dunst = mkProgramOption "dunst"; + fuzzel = mkProgramOption "fuzzel"; + }; + + sway = { + enable = mkEnableOption "sway"; + }; + + gnome.enable = mkEnableOption "gnome"; + + gtk.theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + default = config.collinux.theme; + }; + + programs = { + firefox = { + enable = mkEnableOption "firefox"; + profileName = mkOption { + type = types.str; + default = config.collinux.user.name; + }; + theme = mkOption { + type = types.enum ["none" "catppuccin" "adwaita"]; + default = config.collinux.theme; + }; + }; + foot.enable = mkEnableOption "foot"; + + musescore.enable = mkEnableOption "musescore"; + }; + }; + }; +} diff --git a/modules/desktop/system/components/dunst.nix b/modules/desktop/system/components/dunst.nix new file mode 100644 index 0000000..cb650a1 --- /dev/null +++ b/modules/desktop/system/components/dunst.nix @@ -0,0 +1,38 @@ +{ + lib, + config, + pkgs, + ... +}: let + cfg = config.collinux.desktop.components.dunst; + + settings = pkgs.writeText "dunstrc" '' + [global] + frame_color = "#89b4fa" + separator_color = frame + highlight = "#89b4fa" + offset = "8x30" + origin = "top-right" + transparency = 10 + font = "Iosevka Nerd Font" + + [urgency_low] + background = "#1e1e2e" + foreground = "#cdd6f4" + + [urgency_normal] + background = "#1e1e2e" + foreground = "#cdd6f4" + + [urgency_critical] + background = "#1e1e2e" + foreground = "#cdd6f4" + frame_color = "#fab387" + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files.".config/dunst/dunstrc".source = settings; + packages = [pkgs.dunst]; + }; + } diff --git a/modules/desktop/system/components/fuzzel.nix b/modules/desktop/system/components/fuzzel.nix new file mode 100644 index 0000000..f5937c6 --- /dev/null +++ b/modules/desktop/system/components/fuzzel.nix @@ -0,0 +1,50 @@ +{ + lib, + config, + pkgs, + ... +}: let + cfg = config.collinux.desktop.components.fuzzel; + ini' = pkgs.formats.ini {}; + + settings = ini'.generate "fuzzel.ini" { + main = { + prompt = " "; + dpi-aware = false; + + font = "Iosevka Nerd Font"; + line-height = 25; + lines = 10; + width = 30; + + horizontal-pad = 8; + vertical-pad = 8; + }; + border = { + radius = 0; + width = 2; + }; + + colors = { + background = "1e1e2edd"; + text = "cdd6f4ff"; + prompt = "bac2deff"; + placeholder = "7f849cff"; + input = "cdd6f4ff"; + match = "89b4faff"; + selection = "585b70ff"; + selection-text = "cdd6f4ff"; + selection-match = "89b4faff"; + counter = "7f849cff"; + border = "89b4faff"; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/fuzzel/fuzzel.ini".source = settings; + }; + packages = [pkgs.fuzzel]; + }; + } diff --git a/modules/desktop/system/default.nix b/modules/desktop/system/default.nix new file mode 100644 index 0000000..8ebe9b0 --- /dev/null +++ b/modules/desktop/system/default.nix @@ -0,0 +1,12 @@ +{...}: { + imports = [ + ./environments/gnome.nix + ./environments/sway.nix + + ./programs/firefox.nix + ./programs/foot.nix + + ./components/fuzzel.nix + ./components/dunst.nix + ]; +} diff --git a/modules/desktop/system/environments/gnome.nix b/modules/desktop/system/environments/gnome.nix new file mode 100644 index 0000000..e4f6922 --- /dev/null +++ b/modules/desktop/system/environments/gnome.nix @@ -0,0 +1,67 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.desktop.gnome; +in + lib.mkIf cfg.enable { + services.xserver = { + displayManager.gdm = { + enable = true; + wayland = true; + }; + desktopManager.gnome.enable = true; + }; + + environment.gnome.excludePackages = with pkgs; [ + orca + evince + file-roller + geary + gnome-disk-utility + seahorse + # sushi + # sysprof + # gnome-shell-extensions + adwaita-icon-theme + # nixos-background-info + gnome-backgrounds + # gnome-bluetooth + # gnome-color-manager + # gnome-control-center + # gnome-shell-extensions + gnome-tour # GNOME Shell detects the .desktop file on first log-in. + gnome-user-docs + # glib # for gsettings program + # gnome-menus + # gtk3.out # for gtk-launch program + # xdg-user-dirs # Update user dirs as described in https://freedesktop.org/wiki/Software/xdg-user-dirs/ + # xdg-user-dirs-gtk # Used to create the default bookmarks + # + baobab + epiphany + gnome-text-editor + gnome-calculator + gnome-calendar + gnome-characters + # gnome-clocks + gnome-console + gnome-contacts + gnome-font-viewer + gnome-logs + gnome-maps + gnome-music + # gnome-system-monitor + gnome-weather + # loupe + # nautilus + gnome-connections + simple-scan + snapshot + totem + yelp + gnome-software + ]; + } diff --git a/modules/desktop/system/environments/sway.nix b/modules/desktop/system/environments/sway.nix new file mode 100644 index 0000000..467363a --- /dev/null +++ b/modules/desktop/system/environments/sway.nix @@ -0,0 +1,103 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.desktop.sway; + + colors = pkgs.writeText "catppuccin-mocha" '' + set $rosewater #f5e0dc + set $flamingo #f2cdcd + set $pink #f5c2e7 + set $mauve #cba6f7 + set $red #f38ba8 + set $maroon #eba0ac + set $peach #fab387 + set $yellow #f9e2af + set $green #a6e3a1 + set $teal #94e2d5 + set $sky #89dceb + set $sapphire #74c7ec + set $blue #89b4fa + set $lavender #b4befe + set $text #cdd6f4 + set $subtext1 #bac2de + set $subtext0 #a6adc8 + set $overlay2 #9399b2 + set $overlay1 #7f849c + set $overlay0 #6c7086 + set $surface2 #585b70 + set $surface1 #45475a + set $surface0 #313244 + set $base #1e1e2e + set $mantle #181825 + set $crust #11111b + ''; + + settings = pkgs.writeText "config" '' + exec ${pkgs.foot}/bin/foot --server + exec ${pkgs.swaybg}/bin/swaybg -i ${config.collinux.desktop.wallpaper} + + include catppuccin-mocha + + # target title bg text indicator border + client.focused $lavender $base $text $rosewater $lavender + client.focused_inactive $overlay0 $base $text $rosewater $overlay0 + client.unfocused $overlay0 $base $text $rosewater $overlay0 + client.urgent $peach $base $peach $overlay0 $peach + client.placeholder $overlay0 $base $text $overlay0 $overlay0 + client.background $base + + # bar { + # colors { + # background $base + # statusline $text + # focused_statusline $text + # focused_separator $base + + # # target border bg text + # focused_workspace $base $mauve $crust + # active_workspace $base $surface2 $text + # inactive_workspace $base $base $text + # urgent_workspace $base $red $crust + # } + # } + + bindsym Mod4+1 workspace number 1 + bindsym Mod4+2 workspace number 2 + bindsym Mod4+3 workspace number 3 + bindsym Mod4+4 workspace number 4 + bindsym Mod4+Return exec "${pkgs.foot}/bin/footclient" + bindsym Mod4+Shift+Return exec ${pkgs.foot}/bin/foot + bindsym Mod4+Space exec ${pkgs.fuzzel}/bin/fuzzel + bindsym Mod4+b exec ${pkgs.firefox}/bin/firefox + bindsym Mod4+q kill + + default_border pixel 2 + smart_borders on + smart_gaps on + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/sway/config".source = settings; + ".config/sway/catppuccin-mocha".source = colors; + }; + + packages = [pkgs.sway]; + }; + + # Greetd + services.greetd = { + enable = true; + settings = rec { + initial_session = { + command = "${pkgs.sway}/bin/sway"; + user = config.collinux.user.name; + }; + default_session = initial_session; + }; + }; + } diff --git a/modules/desktop/system/programs/firefox.nix b/modules/desktop/system/programs/firefox.nix new file mode 100644 index 0000000..e5c5e21 --- /dev/null +++ b/modules/desktop/system/programs/firefox.nix @@ -0,0 +1,36 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.desktop.programs.firefox; +in + lib.mkIf cfg.enable { + programs.firefox = { + enable = true; + policies = { + PasswordManagerEnabled = false; # use bitwarden instead + DisableAccounts = true; + DisablePocket = true; + + OverrideFirstRunPage = ""; + OverridePostUpdatePage = ""; + + ExtensionSettings = let + ext = name: { + installation_mode = "force_installed"; + install_url = "https://addons.mozilla.org/firefox/downloads/latest/${name}/latest.xpi"; + }; + in + lib.mkMerge [ + { + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = ext "bitwarden-password-manager"; + "uBlock0@raymondhill.net" = ext "uBlock0@raymondhill.net"; + } + (lib.mkIf (cfg.theme == "catppuccin") { + "{88b098c8-19be-421e-8ffa-85ddd1f3f004}" = ext "catppuccin-mocha-blue"; + }) + ]; + }; + }; + } diff --git a/modules/desktop/system/programs/foot.nix b/modules/desktop/system/programs/foot.nix new file mode 100644 index 0000000..d6f97c7 --- /dev/null +++ b/modules/desktop/system/programs/foot.nix @@ -0,0 +1,64 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.desktop.programs.foot; + ini' = pkgs.formats.ini {listsAsDuplicateKeys = true;}; + + settings = ini'.generate "foot.ini" { + main = { + font = "Iosevka Nerd Font:size=12"; + shell = + if config.collinux.terminal.programs.tmux.enable + then "${pkgs.tmux}/bin/tmux" + else "${pkgs.fish}/bin/fish"; + }; + + cursor.color = "11111b f5e0dc"; + colors = { + foreground = "cdd6f4"; + background = "1e1e2e"; + + regular0 = "45475a"; + regular1 = "f38ba8"; + regular2 = "a6e3a1"; + regular3 = "f9e2af"; + regular4 = "89b4fa"; + regular5 = "f5c2e7"; + regular6 = "94e2d5"; + regular7 = "bac2de"; + + bright0 = "585b70"; + bright1 = "f38ba8"; + bright2 = "a6e3a1"; + bright3 = "f9e2af"; + bright4 = "89b4fa"; + bright5 = "f5c2e7"; + bright6 = "94e2d5"; + bright7 = "a6adc8"; + + "16" = "fab387"; + "17" = "f5e0dc"; + + selection-foreground = "cdd6f4"; + selection-background = "414356"; + + search-box-no-match = "11111b f38ba8"; + search-box-match = "cdd6f4 313244"; + + jump-labels = "11111b fab387"; + urls = "89b4fa"; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/foot/foot.ini".source = settings; + }; + + packages = [pkgs.foot]; + }; + } diff --git a/modules/nix/system/default.nix b/modules/nix/system/default.nix new file mode 100644 index 0000000..c35d3b3 --- /dev/null +++ b/modules/nix/system/default.nix @@ -0,0 +1,23 @@ +{ + nix = { + gc.automatic = false; # use nh cleaner instead + + # Make builds run with low priority so my system stays responsive + daemonCPUSchedPolicy = "idle"; + daemonIOSchedClass = "idle"; + + settings = { + extra-experimental-features = ["nix-command" "flakes" "pipe-operators"]; + auto-optimise-store = true; + use-xdg-base-directories = true; + }; + }; + + # Disable channels + nix.channel.enable = false; + programs.command-not-found.enable = false; # breaks unless you use channels + + nixpkgs = { + config.allowUnfree = true; + }; +} diff --git a/modules/options.nix b/modules/options.nix new file mode 100644 index 0000000..b890831 --- /dev/null +++ b/modules/options.nix @@ -0,0 +1,9 @@ +{lib, ...}: let + inherit (lib) mkOption types; +in { + options = { + collinux.theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + }; + }; +} diff --git a/modules/services/options.nix b/modules/services/options.nix new file mode 100644 index 0000000..344d37d --- /dev/null +++ b/modules/services/options.nix @@ -0,0 +1,20 @@ +{lib, ...}: let + inherit (lib) mkEnableOption mkOption types; +in { + options = { + collinux.services = { + networking = { + enable = mkEnableOption "wifi"; + wifiDaemon = mkOption { + type = types.enum ["networkmanager" "iwd"]; + }; + }; + audio = { + enable = mkEnableOption "pipewire + wireplumber"; + pulse.enable = mkEnableOption "pipewire-pulse"; + # some config to make audio work with wine (TODO for jupiter) + }; + bluetooth.enable = mkEnableOption "bluetooth"; + }; + }; +} diff --git a/modules/services/system/audio.nix b/modules/services/system/audio.nix new file mode 100644 index 0000000..f0586ea --- /dev/null +++ b/modules/services/system/audio.nix @@ -0,0 +1,19 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.services.audio; +in + lib.mkIf cfg.enable { + services.pipewire = { + enable = true; + wireplumber.enable = true; + alsa.enable = true; + + pulse.enable = cfg.pulse.enable; + }; + + environment.systemPackages = [pkgs.pwvucontrol]; + } diff --git a/modules/services/system/bluetooth.nix b/modules/services/system/bluetooth.nix new file mode 100644 index 0000000..a0c3f86 --- /dev/null +++ b/modules/services/system/bluetooth.nix @@ -0,0 +1,16 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.services.bluetooth; +in + lib.mkIf cfg.enable { + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + }; + + environment.systemPackages = [pkgs.blueman]; + } diff --git a/modules/services/system/default.nix b/modules/services/system/default.nix new file mode 100644 index 0000000..4c03dfd --- /dev/null +++ b/modules/services/system/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./networking + ./audio.nix + ./bluetooth.nix + ]; +} diff --git a/modules/services/system/networking/default.nix b/modules/services/system/networking/default.nix new file mode 100644 index 0000000..4908b6f --- /dev/null +++ b/modules/services/system/networking/default.nix @@ -0,0 +1,19 @@ +{ + imports = [ + ./iwd.nix + ./nm.nix + ]; + + config = { + services.resolved = { + enable = true; + domains = [ + "10.0.0.1" + "10.0.0.10" + ]; + }; + + networking.resolvconf.enable = false; + }; +} + diff --git a/modules/services/system/networking/iwd.nix b/modules/services/system/networking/iwd.nix new file mode 100644 index 0000000..5306f29 --- /dev/null +++ b/modules/services/system/networking/iwd.nix @@ -0,0 +1,26 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.services.networking; +in + lib.mkIf (cfg.enable && cfg.wifiDaemon == "iwd") { + networking = { + wireless.iwd = { + enable = true; + settings = { + General = { + EnableNetworkConfiguration = true; # use builtin dhcp client + AddressRandomization = "once"; + }; + Network.NameResolvingService = "systemd"; # either systemd or resolvconf + }; + }; + + # Disable default networking stuff + dhcpcd.enable = false; + useDHCP = false; + networkmanager.enable = false; + }; + } diff --git a/modules/services/system/networking/nm.nix b/modules/services/system/networking/nm.nix new file mode 100644 index 0000000..674664e --- /dev/null +++ b/modules/services/system/networking/nm.nix @@ -0,0 +1,15 @@ +{ + lib, + config, + ... +}: let + cfg = config.collinux.services.networking; +in + lib.mkIf (cfg.enable && cfg.wifiDaemon == "networkmanager") { + networking = { + nameservers = ["1.1.1.1" "1.0.0.1"]; + enableIPv6 = false; + + networkmanager.enable = true; + }; + } diff --git a/modules/terminal/home/default.nix b/modules/terminal/home/default.nix new file mode 100644 index 0000000..a874872 --- /dev/null +++ b/modules/terminal/home/default.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + imports = [ + ./emulators/blackbox.nix # can't do dbus with hjem + ]; +} diff --git a/modules/terminal/home/emulators/blackbox.nix b/modules/terminal/home/emulators/blackbox.nix new file mode 100644 index 0000000..7da15a9 --- /dev/null +++ b/modules/terminal/home/emulators/blackbox.nix @@ -0,0 +1,30 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.terminalEmulators.blackbox; +in + lib.mkIf cfg.enable { + home.packages = [pkgs.blackbox-terminal]; + + dconf = { + enable = true; + settings = { + "com/raggesilver/BlackBox" = { + context-aware-header-bar = true; + fill-tabs = true; + notify-process-completion = true; + opacity = 100; + pixel-scrolling = true; + pretty = true; + show-scrollbars = false; + terminal-padding = "(10, 10, 10, 10)"; + + floating-controls = false; + show-headerbar = true; + }; + }; + }; + } diff --git a/modules/terminal/options.nix b/modules/terminal/options.nix new file mode 100644 index 0000000..b728f99 --- /dev/null +++ b/modules/terminal/options.nix @@ -0,0 +1,77 @@ +{ + pkgs, + config, + lib, + ... +}: let + inherit (lib) mkOption mkEnableOption types; + + mkProgramOption' = name: extraOpts: + { + enable = mkEnableOption "whether to enable ${name}"; + theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + default = config.collinux.terminal.theme; + }; + } + // extraOpts; + + mkProgramOption = name: mkProgramOption' name {}; +in { + options = { + collinux.terminal = { + theme = mkOption { + type = types.enum ["catppuccin" "adwaita"]; + default = config.collinux.theme; + }; + + shells = { + fish = mkProgramOption "fish shell"; + bash = mkProgramOption "bash shell"; + + defaultShell = mkOption { + type = types.package; + description = "which shell is default"; + default = let + cfg = config.collinux.terminal.shells; + in + if (cfg.fish.enable && !cfg.bash.enable) + then pkgs.fish + else if (!cfg.fish.enable && cfg.bash.enable) + then pkgs.bash + else null; + }; + }; + + programs = { + # Themed + starship = mkProgramOption "starship prompt"; + lazygit.enable = mkEnableOption "lazygit"; + nh.enable = mkEnableOption "nh"; + + cmus = mkProgramOption "cmus"; + + git = { + enable = mkEnableOption "git"; + userName = mkOption { + type = types.str; + default = config.collinux.user.name; + }; + userEmail = mkOption { + type = types.str; + }; + }; + + helix = mkProgramOption' "helix text editor" { + hardMode = mkOption { + type = types.bool; + description = "Disable arrow keys and mouse"; + default = false; + }; + }; + + tmux = mkProgramOption "tmux terminal multiplexer"; + }; + }; + }; +} diff --git a/modules/terminal/system/default.nix b/modules/terminal/system/default.nix new file mode 100644 index 0000000..32ca3f9 --- /dev/null +++ b/modules/terminal/system/default.nix @@ -0,0 +1,25 @@ +{ + config, + pkgs, + ... +}: let + cfg = config.collinux.terminal.shells; +in { + imports = [ + ./programs/helix.nix + ./programs/tmux.nix + ./programs/fish.nix + ./programs/starship.nix + ./programs/lazygit.nix + ./programs/cmus.nix + ./programs/git.nix + ]; + + programs.command-not-found.enable = false; # broken without nix-channels + + users.users."${config.collinux.user.name}" = { + shell = cfg.defaultShell; + ignoreShellProgramCheck = true; + packages = [pkgs.nh]; # Couldn't figure out where else to put this + }; +} diff --git a/modules/terminal/system/programs/cmus.nix b/modules/terminal/system/programs/cmus.nix new file mode 100644 index 0000000..3f1639b --- /dev/null +++ b/modules/terminal/system/programs/cmus.nix @@ -0,0 +1,83 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.cmus; + + scripts.statusDisplay = pkgs.writeShellScriptBin "status.sh" '' + while [ $# -ge 2 ]; do + eval _$1='$2' + shift + shift + done + + [ -d ~/.local/share/cmus ] || mkdir ~/.local/share/cmus + + if [ -n "$_file" ]; then + ${pkgs.ffmpeg}/bin/ffmpeg -i "$_file" -y -an -c:v copy ~/.local/share/cmus/curr_cover.jpg || rm ~/.local/share/cmus/curr_cover.jpg + fi + + if [[ "$_status" = "playing" ]]; then + notify-send -t 3000 -u low -i ~/.local/share/cmus/curr_cover.jpg "Now Playing: $_title" "$_artist" + fi + ''; + + cmus_theme = pkgs.writeText "catppuccin.theme" '' + set color_cmdline_bg=default + set color_cmdline_fg=default + set color_error=211 + set color_info=223 + set color_separator=8 + set color_statusline_bg=default + set color_statusline_fg=default + set color_titleline_bg=183 + set color_titleline_fg=8 + set color_titleline_attr=bold + set color_win_bg=default + set color_win_cur=117 + set color_win_cur_sel_bg=117 + set color_win_cur_sel_fg=235 + set color_win_dir=default + set color_win_fg=default + set color_win_inactive_cur_sel_bg=0 + set color_win_inactive_cur_sel_fg=default + set color_win_inactive_sel_bg=0 + set color_win_inactive_sel_fg=default + set color_win_sel_bg=15 + set color_win_sel_fg=235 + set color_win_title_bg=default + set color_win_title_fg=183 + set color_win_title_attr=bold + ''; + + cmus_rc = pkgs.writeText "rc" '' + colorscheme catppuccin + set status_display_program=${scripts.statusDisplay}/bin/status.sh + ''; + + cava_config = pkgs.writeText "config" '' + [color] + gradient=1 + gradient_color_1='#94e2d5' + gradient_color_2='#89dceb' + gradient_color_3='#74c7ec' + gradient_color_4='#89b4fa' + gradient_color_5='#cba6f7' + gradient_color_6='#f5c2e7' + gradient_color_7='#eba0ac' + gradient_color_8='#f38ba8' + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/cmus/rc".source = cmus_rc; + ".config/cmus/catppuccin.theme".source = cmus_theme; + ".config/cava/config".source = cava_config; + }; + + packages = with pkgs; [cava cmus]; + }; + } diff --git a/modules/terminal/system/programs/fish.nix b/modules/terminal/system/programs/fish.nix new file mode 100644 index 0000000..89d26ef --- /dev/null +++ b/modules/terminal/system/programs/fish.nix @@ -0,0 +1,57 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.terminal.shells.fish; + + init = pkgs.writeText "config.fish" '' + set fish_greeting + + function starship_transient_prompt_func + ${pkgs.starship}/bin/starship module character + end + + if status is-interactive + alias cat bat + + alias eza "eza -A -w 80 --group-directories-first -I '.git*'" + alias ls eza + alias tree "ls -T" + + ${pkgs.fzf}/bin/fzf --fish | source + ${pkgs.starship}/bin/starship init fish | source + + enable_transience + + # env vars + set -x EDITOR hx + set -x NH_FLAKE "$HOME/nixos" + + set -x BAT_THEME "base16" + set -x FZF_DEFAULT_OPTS "--color bg:#1E1E2E,bg+:#313244,border:#313244,fg:#CDD6F4,fg+:#CDD6F4,header:#F38BA8,hl:#F38BA8,hl+:#F38BA8,info:#CBA6F7,label:#CDD6F4,marker:#B4BEFE,pointer:#F5E0DC,prompt:#CBA6F7,selected-bg:#45475A,spinner:#F5E0DC" + end + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/fish/config.fish".source = init; + }; + + packages = with pkgs; [ + fish + bat + eza + fzf + ripgrep + fd + moreutils + zip + unzip + btop + jq + ]; + }; + } diff --git a/modules/terminal/system/programs/git.nix b/modules/terminal/system/programs/git.nix new file mode 100644 index 0000000..b7c85bc --- /dev/null +++ b/modules/terminal/system/programs/git.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.collinux.terminal.programs.git; + + git_config = pkgs.writeText "config" '' + [alias] + stage = "add" + unstage = "restore --staged" + + [init] + defaultBranch = "main" + + [user] + email = "${cfg.userEmail}" + name = "${cfg.userName}" + ''; +in { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/git/config".source = git_config; + }; + + packages = [pkgs.git]; + }; +} diff --git a/modules/terminal/system/programs/helix.nix b/modules/terminal/system/programs/helix.nix new file mode 100644 index 0000000..4ba78d0 --- /dev/null +++ b/modules/terminal/system/programs/helix.nix @@ -0,0 +1,139 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.helix; + toml' = pkgs.formats.toml {}; + + languages = toml'.generate "languages.toml" { + language = [ + { + name = "nix"; + file-types = ["nix"]; + language-servers = ["nil"]; + indent = { + tab-width = 2; + unit = " "; + }; + formatter.command = "${pkgs.alejandra}/bin/alejandra"; + auto-format = true; + } + { + name = "html"; + file-types = ["html"]; + language-servers = ["superhtml"]; + auto-format = true; + } + ]; + }; + + customCatppuccinTheme = toml'.generate "catppuccin_mocha_transparent.toml" { + inherits = "catppuccin_mocha"; + "ui.background" = {}; + }; + + mkHelixConfig = { + theme, + hardMode ? false, + }: + toml'.generate "config.toml" { + inherit theme; + editor = { + gutters = ["diff" "diagnostics" "line-numbers" "spacer" "spacer"]; + cursorline = true; + color-modes = true; + + mouse = !hardMode; + + lsp.display-inlay-hints = true; + + statusline = { + left = ["mode" "file-name" "spacer" "file-modification-indicator"]; + right = ["spinner" "spacer" "workspace-diagnostics" "file-type"]; + separator = "x"; + }; + + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; + }; + }; + keys = { + normal = + { + "C-space" = "expand_selection"; + "A-j" = ["extend_to_line_bounds" "delete_selection" "paste_after"]; + "A-k" = ["extend_to_line_bounds" "delete_selection" "move_line_up" "paste_before"]; + "X" = ["extend_line_up" "extend_to_line_bounds"]; + "C-left" = "goto_line_start"; + "C-right" = "goto_line_end"; + ";" = "flip_selections"; + "esc" = ["collapse_selection" "keep_primary_selection"]; + + # I don't even use these anyway + "pageup" = "no_op"; + "pagedown" = "no_op"; + "home" = "no_op"; + "end" = "no_op"; + } + // ( + if hardMode + then { + "up" = "no_op"; + "down" = "no_op"; + "left" = "no_op"; + "right" = "no_op"; + } + else {} + ); + + insert = + { + "pageup" = "no_op"; + "pagedown" = "no_op"; + "home" = "no_op"; + "end" = "no_op"; + } + // ( + if hardMode + then { + "up" = "no_op"; + "down" = "no_op"; + "left" = "no_op"; + "right" = "no_op"; + } + else {} + ); + + select = { + "esc" = ["collapse_selection" "insert_mode"]; + }; + }; + }; + + settings = mkHelixConfig { + inherit (cfg) hardMode; + theme = + if cfg.theme == "catppuccin" + then "catppuccin_mocha_transparent" + else if cfg.theme == "adwaita" + then "adwaita_dark" + else ""; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/helix/config.toml".source = settings; + ".config/helix/languages.toml".source = languages; + ".config/helix/themes/catppuccin_mocha_transparent.toml".source = customCatppuccinTheme; + }; + + packages = [ + pkgs.helix + ]; + }; + } diff --git a/modules/terminal/system/programs/lazygit.nix b/modules/terminal/system/programs/lazygit.nix new file mode 100644 index 0000000..4c048a0 --- /dev/null +++ b/modules/terminal/system/programs/lazygit.nix @@ -0,0 +1,26 @@ +{ + pkgs, + config, + lib, + ... +}: let + cfg = config.collinux.terminal.programs.lazygit; + yaml' = pkgs.formats.yaml {}; + + settings = yaml'.generate "config.yml" { + git.paging.pager = "${pkgs.diff-so-fancy}/bin/diff-so-fancy"; + gui = { + showRandomTip = false; + commitLength.show = false; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/lazygit/config.yml".source = settings; + }; + + packages = [pkgs.lazygit]; + }; + } diff --git a/modules/terminal/system/programs/starship.nix b/modules/terminal/system/programs/starship.nix new file mode 100644 index 0000000..60fcc00 --- /dev/null +++ b/modules/terminal/system/programs/starship.nix @@ -0,0 +1,48 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.starship; + toml' = pkgs.formats.toml {}; + + settings = toml'.generate "starship.toml" { + format = ''$directory$git_branch$git_status $character''; + + add_newline = false; + scan_timeout = 10; + + character = { + success_symbol = "[λ](green bold)"; + error_symbol = "[Σ](red bold)"; + }; + + git_branch.format = "[@$branch](underline)"; + + git_status = { + format = "$modified$staged$ahead$behind"; + modified = "[!](red bold)"; + staged = "[+](green bold)"; + ahead = "[](green)"; + behind = "[](red)"; + }; + + directory = { + format = "$path"; + truncation_length = 3; + truncate_to_repo = true; + }; + }; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/starship.toml".source = settings; + }; + + packages = [ + pkgs.starship + ]; + }; + } diff --git a/modules/terminal/system/programs/tmux.nix b/modules/terminal/system/programs/tmux.nix new file mode 100644 index 0000000..b947d95 --- /dev/null +++ b/modules/terminal/system/programs/tmux.nix @@ -0,0 +1,164 @@ +{ + pkgs, + lib, + config, + ... +}: let + cfg = config.collinux.terminal.programs.tmux; + + scripts.bat = pkgs.writeShellScriptBin "battery.sh" '' + energy_now=$(cat /sys/class/power_supply/BAT0/energy_now) + energy_full=$(cat /sys/class/power_supply/BAT0/energy_full) + percentage=$((energy_now * 100 / energy_full)) + printf "%.0f%%" "$percentage" + ''; + + scripts.primeProjects = pkgs.writeShellScriptBin "projects.sh" '' + FZF_DEFAULT_OPTS="--color bg:#1E1E2E,bg+:#313244,border:#313244,fg:#CDD6F4,fg+:#CDD6F4,header:#F38BA8,hl:#F38BA8,hl+:#F38BA8,info:#CBA6F7,label:#CDD6F4,marker:#B4BEFE,pointer:#F5E0DC,prompt:#CBA6F7,selected-bg:#45475A,spinner:#F5E0DC" + + projects=" + $(find $HOME/projects -maxdepth 1 -mindepth 1 -type d) + $HOME/Documents/brain2.0 + $HOME/Music + $HOME/nixos + " + if [ $# -eq 1 ]; then + selected="$1" + else + selected="$(echo "$projects" | fzf --tmux --style=minimal --info=hidden $FZF_DEFAULT_OPTS)" + fi + + [ -z "$selected" ] && exit + + session_name="$(basename "$selected" | tr '.' '_')" + + if tmux list-sessions | grep -q "^$session_name:"; then + # session already exists, switch to it + tmux switch -t "$session_name" + else + # session doesn't exist, create it and switch to it + tmux new-session -ds "$session_name" -c "$selected" + tmux switch -t "$session_name" + fi + ''; + + scripts.cleanSessions = pkgs.writeShellScriptBin "clean-sessions.sh" '' + current="$(tmux display-message -p '#S')" + + tmux list-sessions -F '#S' | while read -r line; do + if [[ "$line" != "$current" && "$line" =~ ^[[:digit:]]+$ ]]; then + tmux kill-session -t "$line" + fi + done + ''; + + scripts.bar = pkgs.writeShellScriptBin "bar.sh" '' + text="#c6d0f5" + text_dark="#7F849C" + blue="#b3befe" + green="#a6d189" + red="#f38ba8" + bg_dark="#181825" + bg_light="#1E1E2E" + + tset() { + tmux set -gq "$@" + } + + tset status on + + tset status-position bottom + tset status-justify absolute-centre + tset status-bg $bg_light + + tset status-left-style fg=$green + tset status-left "  #{client_session} " + + tset window-status-style fg=$text_dark + tset window-status-format "#I:#W" + tset window-status-current-style fg=$blue,bold + tset window-status-current-format "#I:#W" + tset window-status-separator " " + + tset status-right-style fg=$red + tset status-right "#(${scripts.bat}/bin/battery.sh)" + + ## pane borders + tset pane-border-style fg=$bg_dark,bg=$bg_dark + tset pane-active-border-style fg=$bg_dark,bg=$bg_dark + + ## pane backgrounds + # Set the foreground/background color for the active window + tset window-active-style bg=$bg_light + + # Set the foreground/background color for all other windows + tset window-style bg=$bg_dark + ''; + + plugins.tmux-resurrect = builtins.fetchGit { + url = "https://github.com/tmux-plugins/tmux-resurrect"; + rev = "cff343cf9e81983d3da0c8562b01616f12e8d548"; + }; + + tmux-conf = pkgs.writeText "tmux.conf" '' + # Resurrect + run-shell ${plugins.tmux-resurrect}/resurrect.tmux + set -g @resurrect-dir "$HOME/.local/share/tmux-resurrect" + set -g @resurrect-processes 'hx cmus cava nix-shell' + + set -g mouse on + + # bell + set -g visual-activity off + set -g visual-bell off + set -g visual-silence off + setw -g monitor-activity off + set -g bell-action none + + # Panes + bind-key -n C-w kill-pane + + bind -n C-Enter if -F '#{e|>:#{e|/:#{pane_width},#{pane_height}},2.5}' { + split-window -h -c '#{pane_current_path}' + } { + split-window -v -c '#{pane_current_path}' + } + + unbind -n MouseDown3Pane ## disable right click menu + bind-key -n M-z resize-pane -Z ## Pane zoom + + # Windows + bind-key -n C-t new-window -c '#{pane_current_path}' + bind-key -n C-Tab next-window + bind-key -n C-S-Tab previous-window # doesn't work in foot :( + + set -g renumber-windows on + set -g allow-rename off + + # Statusbar + set-hook -g client-attached 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + set-hook -g window-linked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + set-hook -g window-unlinked 'if -F "#{==:#{session_windows},1}" { set status off } { set status on }' + + run-shell "${scripts.bar}/bin/bar.sh" + + # Sessions + # set-hook -ag client-detached 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh' + # set-hook -ag client-session-changed 'run-shell ${scripts.cleanSessions}/bin/clean-sessions.sh' + + bind-key -n C-f run-shell "${scripts.primeProjects}/bin/projects.sh" + bind-key -n M-1 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Music" + bind-key -n M-2 run-shell "${scripts.primeProjects}/bin/projects.sh ~/Documents/brain2.0" + bind-key -n M-3 run-shell "${scripts.primeProjects}/bin/projects.sh ~/nixos" + + bind-key -n C-g display-popup -E -w 80% -h 80% -x C -y C -d "#{pane_current_path}" "${pkgs.lazygit}/bin/lazygit" + ''; +in + lib.mkIf cfg.enable { + hjem.users."${config.collinux.user.name}" = { + files = { + ".config/tmux/tmux.conf".source = tmux-conf; + }; + packages = [pkgs.tmux]; + }; + } diff --git a/modules/user/home/default.nix b/modules/user/home/default.nix new file mode 100644 index 0000000..9394bca --- /dev/null +++ b/modules/user/home/default.nix @@ -0,0 +1,3 @@ +{ + home.preferXdgDirectories = true; +} diff --git a/modules/user/options.nix b/modules/user/options.nix new file mode 100644 index 0000000..f5c7a5f --- /dev/null +++ b/modules/user/options.nix @@ -0,0 +1,23 @@ +{ + config, + lib, + ... +}: let + inherit (lib) mkOption types; +in { + options = { + collinux.user = { + name = mkOption { + type = types.str; + }; + password = mkOption { + type = types.str; + description = "hashed password for user"; + }; + isAdmin = mkOption { + type = types.bool; + default = true; + }; + }; + }; +} diff --git a/modules/user/system/default.nix b/modules/user/system/default.nix new file mode 100644 index 0000000..52d8116 --- /dev/null +++ b/modules/user/system/default.nix @@ -0,0 +1,25 @@ +{config, ...}: let + cfg = config.collinux.user; +in { + users.users."${cfg.name}" = { + isNormalUser = true; + description = cfg.name; + extraGroups = + ["networkmanager" "disks"] + ++ ( + if cfg.isAdmin + then ["wheel"] + else [] + ); + hashedPassword = cfg.password; + }; + + hjem.clobberByDefault = true; + hjem.users."${cfg.name}" = { + enable = true; + directory = "/home/${cfg.name}"; + user = cfg.name; + }; + + security.sudo-rs.enable = true; +} -- cgit v1.3.1