diff --git a/modules/home/app/zed/default.nix b/modules/home/app/zed/default.nix new file mode 100644 index 0000000..c0e8e3d --- /dev/null +++ b/modules/home/app/zed/default.nix @@ -0,0 +1,73 @@ +{ + lib, + pkgs, + self, + config, + osConfig, + ... +}: let + inherit (lib) mkEnableOption mkIf; + inherit (self) namespace; + + cfg = config.${namespace}.apps.zed; +in { + options.${namespace}.apps.zed = { + enable = mkEnableOption "zed, the graphical editor from the future"; + }; + + config = mkIf cfg.enable { + sops.secrets.wakatime-cfg = { + format = "binary"; + sopsFile = "${self.outPath}/${osConfig.networking.hostname}/secrets/wakatime.cfg"; + path = "/home/${config.home.homeDirectory}/.wakatime.cfg"; + }; + + home.packages = with pkgs; [ + alejandra + ]; + + programs.zed-editor = { + enable = true; + extensions = ["nix" "catppuccin" "wakatime" "discord_presence" "deno"]; + + userSettings = { + icon_theme = "Catppuccin Macchiato"; + theme = { + dark = "Catppuccin Macchiato (blue)"; + light = "Catppuccin Macchiato (blue)"; + }; + + ### Disable telemetry + telemetry = { + metrics = false; + }; + + ### Disable certain AI features + features = { + copilot = false; + }; + + ### Language specific configurations + languages = { + ### Nix language + Nix = { + language_servers = ["nixd" "!nil"]; + }; + }; + + ### LSP configurations + lsp = { + nixd = { + initialization_options = { + formatting = { + command = ["alejandra" "--quiet" "--"]; + }; + }; + }; + }; + }; + + extraPackages = with pkgs; [nixd]; + }; + }; +} diff --git a/modules/home/default.nix b/modules/home/default.nix deleted file mode 100644 index ea8f50d..0000000 --- a/modules/home/default.nix +++ /dev/null @@ -1,2 +0,0 @@ -{...}: { -} diff --git a/modules/home/desktop/gnome/default.nix b/modules/home/desktop/gnome/default.nix new file mode 100644 index 0000000..aed83e5 --- /dev/null +++ b/modules/home/desktop/gnome/default.nix @@ -0,0 +1,91 @@ +{ + lib, + pkgs, + self, + config, + osConfig, + ... +}: let + inherit (lib) mkIf mkOption; + inherit (self) namespace; + inherit (self.lib) mkOpt; + + cfg = config.${namespace}.desktop.gnome; +in { + options.${namespace}.desktop.gnome = with lib.types; { + enabled-extensions = mkOption { + type = listOf package; + default = with pkgs.gnomeExtensions; [user-themes blur-my-shell appindicator unite color-picker clipboard-history]; + example = [dash-to-dock blur-my-shell]; + description = "Specify gnome extensions to install."; + }; + favorite-apps = mkOption { + type = listOf str; + default = ["org.gnome.Nautilus.desktop" "obsidian.desktop" "firefox.desktop" "dev.zed.Zed.desktop"]; + example = ["org.gnome.Nautilus.desktop" "obsidian.desktop"]; + description = "Specify your favorite apps (sorted left to right)."; + }; + extensions = { + unite = { + show-window-buttons = mkOption { + type = str; + default = "never"; + example = "never | maximized | tiled | both | always"; + description = "Specify when Unite should display window buttons within the top panel."; + }; + hide-window-titlebars = mkOption { + type = str; + default = "maximized"; + example = "never | maximized | tiled | both | always"; + description = "Specify when Unite should hide window titlebars."; + }; + }; + blur-my-shell = { + enable-blur = mkOpt bool false "Whether to enable blur-my-shell application blur."; + }; + }; + wallpaper = mkOpt str (builtins.toString ../wallpapers/mountain_tower_sunset.jpg) "Specify the path of your prefered Gnome wallpaper."; + }; + + config = mkIf osConfig.${namespace}.desktop.gnome.enable { + home.packages = cfg.enabled-extensions; + + dconf.settings = { + "org/gnome/shell" = { + favorite-apps = cfg.favorite-apps; + enabled-extensions = lib.forEach cfg.enabled-extensions (x: x.extensionUuid); + disabled-extensions = []; # Make sure none of our extensions are disabled on system rebuild + }; + "org/gnome/shell/extensions/unite" = mkIf (builtins.elem pkgs.gnomeExtensions.unite cfg.enabled-extensions) { + show-window-buttons = cfg.extensions.unite.show-window-buttons; + hide-window-titlebars = cfg.extensions.unite.hide-window-titlebars; + + use-activities-text = false; + extend-left-box = false; + reduce-panel-spacing = false; + show-legacy-tray = false; + show-appmenu-button = false; + show-desktop-name = false; + enable-titlebar-actions = false; + restrict-to-primary-screen = false; + hide-activities-button = "never"; + autofocus-windows = true; + notifications-position = "right"; + }; + "org/gnome/shell/extensions/blur-my-shell/applications" = mkIf cfg.extensions.blur-my-shell.enable-blur { + blur = true; + sigma = 30; + opacity = 230; + enable-all = true; + dynamic-opacity = false; + }; + "org/gnome/desktop/background" = { + picture-uri = cfg.wallpaper; + picture-uri-dark = cfg.wallpaper; + }; + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + }; +} diff --git a/modules/home/desktop/wallpapers/catppuccin/catppuccin_bright_gradient.png b/modules/home/desktop/wallpapers/catppuccin/catppuccin_bright_gradient.png new file mode 100644 index 0000000..8cd1937 Binary files /dev/null and b/modules/home/desktop/wallpapers/catppuccin/catppuccin_bright_gradient.png differ diff --git a/modules/home/desktop/wallpapers/catppuccin/mountain_tower_sunset.jpg b/modules/home/desktop/wallpapers/catppuccin/mountain_tower_sunset.jpg new file mode 100644 index 0000000..6f94f2d Binary files /dev/null and b/modules/home/desktop/wallpapers/catppuccin/mountain_tower_sunset.jpg differ diff --git a/modules/nixos/archetypes/laptop/default.nix b/modules/nixos/archetypes/laptop/default.nix new file mode 100644 index 0000000..7610b69 --- /dev/null +++ b/modules/nixos/archetypes/laptop/default.nix @@ -0,0 +1,24 @@ +{ + lib, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf; + inherit (self) namespace; + + cfg = config.${namespace}.archetypes.laptop; +in { + options.${namespace}.archetypes.laptop = { + enable = mkEnableOption "the laptop archetype."; + }; + + config = mkIf cfg.enable { + ${namespace} = { + # Inherit from workstation archetype + archetypes.workstation.enable = true; + }; + + hardware.sensor.iio.enable = true; # Enable iio-sensor for automatic screen rotation and similar features. + }; +} diff --git a/modules/nixos/archetypes/workstation/default.nix b/modules/nixos/archetypes/workstation/default.nix index 32b3c1a..914b59a 100644 --- a/modules/nixos/archetypes/workstation/default.nix +++ b/modules/nixos/archetypes/workstation/default.nix @@ -16,9 +16,20 @@ in { config = mkIf cfg.enable { ${namespace} = { # Basic system functionality - system.grub.enable = true; - system.networking.enable = true; - system.kernel.enable = true; + system = { + networking.enable = true; + grub.enable = true; + shell.enable = true; + locale.enable = true; + fonts.enable = true; + bluetooth.enable = true; + audio.enable = true; + kernel.enable = true; + nix = { + enable = true; + use-lix = true; + }; + }; # Services services.docker.enable = true; diff --git a/modules/nixos/desktop/gnome/default.nix b/modules/nixos/desktop/gnome/default.nix index 01e40ba..d403db9 100644 --- a/modules/nixos/desktop/gnome/default.nix +++ b/modules/nixos/desktop/gnome/default.nix @@ -1,7 +1,8 @@ { lib, - config, + pkgs, self, + config, ... }: let inherit (lib) mkEnableOption mkIf; @@ -17,5 +18,29 @@ in { services.xserver.enable = true; services.xserver.displayManager.gdm.enable = true; services.xserver.desktopManager.gnome.enable = true; + + environment.gnome.excludePackages = with pkgs; [ + gnome-tour + gedit + cheese + geary + yelp # Help view + epiphany # Gnome web + gnome-console + gnome-terminal + gnome-music + hitori # Sudoku game + gnome-contacts + gnome-initial-setup + gnome-system-monitor + ]; + + programs.dconf.enable = true; + services.gnome.gnome-keyring.enable = true; + + environment.systemPackages = with pkgs; [ + gnome-tweaks + resources + ]; }; } diff --git a/modules/nixos/system/audio/default.nix b/modules/nixos/system/audio/default.nix new file mode 100644 index 0000000..f022058 --- /dev/null +++ b/modules/nixos/system/audio/default.nix @@ -0,0 +1,27 @@ +{ + lib, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf; + inherit (self) namespace; + + cfg = config.${namespace}.system.audio; +in { + options.${namespace}.system.audio = { + enable = mkEnableOption "system audio support."; + }; + + config = mkIf cfg.enable { + services.pulseaudio.enable = false; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + }; +} diff --git a/modules/nixos/system/bluetooth/default.nix b/modules/nixos/system/bluetooth/default.nix new file mode 100644 index 0000000..c5f55df --- /dev/null +++ b/modules/nixos/system/bluetooth/default.nix @@ -0,0 +1,36 @@ +{ + lib, + pkgs, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf; + inherit (self) namespace; + + cfg = config.${namespace}.system.bluetooth; +in { + options.${namespace}.system.bluetooth = { + enable = mkEnableOption "bluetooth support."; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [bluez]; + + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + package = pkgs.bluez; + + settings = { + General = { + ControllerMode = "dual"; + FastConnectable = "true"; + Experimental = "true"; + KernelExperimental = "true"; + Disable = "Handsfree"; + }; + }; + }; + }; +} diff --git a/modules/nixos/system/fonts/default.nix b/modules/nixos/system/fonts/default.nix new file mode 100644 index 0000000..43f9966 --- /dev/null +++ b/modules/nixos/system/fonts/default.nix @@ -0,0 +1,28 @@ +{ + lib, + pkgs, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf mkOption; + inherit (self) namespace; + + cfg = config.${namespace}.system.fonts; +in { + options.${namespace}.system.fonts = with lib.types; { + enable = mkEnableOption "system font management"; + fonts = mkOption { + type = listOf package; + default = with pkgs; [noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-emoji nerd-fonts.bigblue-terminal nerd-fonts.zed-mono monocraft]; + example = [noto-fonts noto-fonts-emoji]; + description = "Install additional font packages"; + }; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [font-manager]; + + fonts.packages = cfg.fonts; + }; +} diff --git a/modules/nixos/system/locale/default.nix b/modules/nixos/system/locale/default.nix new file mode 100644 index 0000000..bccefd9 --- /dev/null +++ b/modules/nixos/system/locale/default.nix @@ -0,0 +1,58 @@ +{ + lib, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf mkOption; + inherit (self) namespace; + + cfg = config.${namespace}.system.locale; +in { + options.${namespace}.system.locale = { + enable = mkEnableOption "system locale tweaks."; + + language = mkOption { + type = lib.types.str; + default = "en_US"; + example = "en_US"; + description = "Sets the language for most text, doesn't include monetary or measurement settings"; + }; + + country = mkOption { + type = lib.types.str; + default = "de_DE"; + example = "de_DE"; + description = "Sets the language used for monetary or measurement settings (USD vs Euro, etc...)"; + }; + + keymap = mkOption { + type = lib.types.str; + default = "de"; + example = "de"; + description = "Sets the keymap to be used by the system"; + }; + }; + + config = mkIf cfg.enable { + # Internationalisation properties. + i18n.defaultLocale = "${cfg.language}.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "${cfg.country}.UTF-8"; + LC_IDENTIFICATION = "${cfg.country}.UTF-8"; + LC_MEASUREMENT = "${cfg.country}.UTF-8"; + LC_MONETARY = "${cfg.country}.UTF-8"; + LC_NAME = "${cfg.country}.UTF-8"; + LC_NUMERIC = "${cfg.country}.UTF-8"; + LC_PAPER = "${cfg.country}.UTF-8"; + LC_TELEPHONE = "${cfg.country}.UTF-8"; + LC_TIME = "${cfg.country}.UTF-8"; + }; + + # Set console keymap. + console.keyMap = cfg.keymap; + services.xserver = { + xkb.layout = cfg.keymap; + }; + }; +} diff --git a/modules/nixos/system/nix/default.nix b/modules/nixos/system/nix/default.nix new file mode 100644 index 0000000..a58b09c --- /dev/null +++ b/modules/nixos/system/nix/default.nix @@ -0,0 +1,50 @@ +{ + lib, + pkgs, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf; + inherit (self) namespace; + + cfg = config.${namespace}.system.nix; +in { + options.${namespace}.system.nix = { + enable = mkEnableOption "Nix configuration overrides."; + use-lix = mkEnableOption "Lix as an alternative to CppNix."; + use-nixld = mkEnableOption "the use of dynamically linked executables on nix based systems."; + }; + + config = mkIf cfg.enable { + nix = { + settings = { + auto-optimise-store = true; + builders-use-substitutes = true; + experimental-features = ["nix-command" "flakes"]; + keep-derivations = true; + keep-outputs = true; + max-jobs = "auto"; + warn-dirty = false; + }; + + # Garbage collection configuration. + gc = { + automatic = true; + dates = "daily"; + options = "--delete-older-than 3d"; + }; + + package = mkIf cfg.use-lix pkgs.lix; # Enable LIX + }; + + # Dynamic libraries for unpackaged programs + programs.nix-ld = mkIf cfg.use-nixld { + enable = true; + libraries = with pkgs; [ + glibc + libcxx + ]; + }; + }; +} diff --git a/modules/nixos/system/shell/default.nix b/modules/nixos/system/shell/default.nix new file mode 100644 index 0000000..d47951d --- /dev/null +++ b/modules/nixos/system/shell/default.nix @@ -0,0 +1,25 @@ +{ + lib, + pkgs, + self, + config, + ... +}: let + inherit (lib) mkEnableOption mkIf types; + inherit (self) namespace; + inherit (self.lib) mkOpt; + + cfg = config.${namespace}.system.shell; +in { + options.${namespace}.system.shell = { + enable = mkEnableOption "custom user shells."; + installed = mkOpt types.listOf types.package [pkgs.fish] "List of shell packages to install"; + default = mkOpt types.str "fish" "Set a custom shell as the default for all users."; + }; + + config = mkIf cfg.enable { + environment.shells = cfg.installed; + users.defaultUserShell = pkgs.${cfg.shell.type}; + programs.${cfg.shell.type}.enable = true; + }; +} diff --git a/systems/x86_64-nixos/puzzlevision/default.nix b/systems/x86_64-nixos/puzzlevision/default.nix index dcde7a3..d61aa5f 100644 --- a/systems/x86_64-nixos/puzzlevision/default.nix +++ b/systems/x86_64-nixos/puzzlevision/default.nix @@ -16,7 +16,7 @@ extraGroups = ["wheel"]; }; - archetypes.workstation.enable = true; + archetypes.laptop.enable = true; }; # Configure 8GB SWAP partition