From 3bc1d1e246b8d90b491382f799250306979e4d84 Mon Sep 17 00:00:00 2001 From: Cookiez Date: Fri, 21 Nov 2025 16:32:49 +0100 Subject: [PATCH] Moved modules into a new Modules subdirectory. Started config of install.sh script. Moved home manager config out of flake. --- boot-splash.nix | 22 - flake.nix | 17 +- hosts/default/default.nix | 19 + hosts/default/hardware.nix | 55 ++ hosts/default/host-packages.nix | 6 + hosts/default/variables.nix | 113 ++++ install.sh | 504 ++++++++++++++++++ modules/boot-splash.nix | 22 + .../configuration.nix | 33 +- modules/default.nix | 11 + .../desktop-entries.nix | 0 firefox.nix => modules/firefox.nix | 0 .../hardware-configuration.nix | 0 home.nix => modules/home.nix | 0 minimal.nix => modules/minimal.nix | 0 neovim-home.nix => modules/neovim-home.nix | 0 neovim.nix => modules/neovim.nix | 0 packages.nix => modules/packages.nix | 0 zsh.nix => modules/zsh.nix | 13 +- 19 files changed, 759 insertions(+), 56 deletions(-) delete mode 100644 boot-splash.nix create mode 100644 hosts/default/default.nix create mode 100644 hosts/default/hardware.nix create mode 100644 hosts/default/host-packages.nix create mode 100644 hosts/default/variables.nix create mode 100755 install.sh create mode 100644 modules/boot-splash.nix rename configuration.nix => modules/configuration.nix (91%) create mode 100644 modules/default.nix rename desktop-entries.nix => modules/desktop-entries.nix (100%) rename firefox.nix => modules/firefox.nix (100%) rename hardware-configuration.nix => modules/hardware-configuration.nix (100%) rename home.nix => modules/home.nix (100%) rename minimal.nix => modules/minimal.nix (100%) rename neovim-home.nix => modules/neovim-home.nix (100%) rename neovim.nix => modules/neovim.nix (100%) rename packages.nix => modules/packages.nix (100%) rename zsh.nix => modules/zsh.nix (67%) diff --git a/boot-splash.nix b/boot-splash.nix deleted file mode 100644 index fe93aaa..0000000 --- a/boot-splash.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ config, lib, pkgs, ... }: -{ -boot = { - # silence first boot output - consoleLogLevel = 3; - initrd.verbose = false; - initrd.systemd.enable = true; - kernelParams = [ - "quiet" - "splash" - "intremap=on" - "boot.shell_on_fail" - "udev.log_priority=3" - "rd.systemd.show_status=auto" - ]; - - # plymouth, showing after LUKS unlock - plymouth.enable = true; - plymouth.font = "${pkgs.hack-font}/share/fonts/truetype/Hack-Regular.ttf"; - plymouth.logo = "${pkgs.nixos-icons}/share/icons/hicolor/128x128/apps/nix-snowflake.png"; -}; -} diff --git a/flake.nix b/flake.nix index 9ebf705..5d4a8c4 100644 --- a/flake.nix +++ b/flake.nix @@ -49,26 +49,13 @@ nixos = nixpkgs.lib.nixosSystem { inherit system; specialArgs = { - inherit inputs username version; + inherit inputs username version system; }; modules = [ - ./configuration.nix - ./firefox.nix - ./boot-splash.nix - ./zsh.nix - ./neovim.nix - ./packages.nix + ./modules grub2-themes.nixosModules.default nix-flatpak.nixosModules.nix-flatpak stylix.nixosModules.stylix - home-manager.nixosModules.home-manager - { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.users.${username} = ./home.nix; - home-manager.backupFileExtension = "backup"; # Automatically backs up conflicting files during activation - home-manager.extraSpecialArgs = { inherit inputs username version; system = "x86_64-linux"; }; - } #Conditional Modules! ] ++ (if hyprlandEnabled then [ ./hyprland/hyprland.nix ] else [ ]) ++ [ ] ++ (if plasmaEnabled then [ ./plasma/plasma.nix ] else [ ]) ++ [ diff --git a/hosts/default/default.nix b/hosts/default/default.nix new file mode 100644 index 0000000..bbd8853 --- /dev/null +++ b/hosts/default/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: +{ + imports = [ + ./hardware.nix + ./host-packages.nix + ]; + + # Enable sddm display manager + services.displayManager.sddm.enable = true; + + # Sysc-greet display manager + services.sysc-greet.enable = false; + + # Keep niri available at system level for ly display manager to detect it + programs.niri.package = pkgs.niri; + + # Ensure niri session is available to display manager + services.displayManager.sessionPackages = [ pkgs.niri ]; +} diff --git a/hosts/default/hardware.nix b/hosts/default/hardware.nix new file mode 100644 index 0000000..28c77e4 --- /dev/null +++ b/hosts/default/hardware.nix @@ -0,0 +1,55 @@ +# Do not modify this file! It was generated by 'nixos-generate-config' +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ + "xhci_pci" + "ahci" + "nvme" + "usbhid" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/00000000-0000-0000-0000-000000000000"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/0000-0000"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" + ]; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/00000000-0000-0000-0000-000000000000"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp4s0.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/default/host-packages.nix b/hosts/default/host-packages.nix new file mode 100644 index 0000000..8030e23 --- /dev/null +++ b/hosts/default/host-packages.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + environment.systemPackages = with pkgs; [ + # Add host-specific packages here + ]; +} diff --git a/hosts/default/variables.nix b/hosts/default/variables.nix new file mode 100644 index 0000000..1b9bc8f --- /dev/null +++ b/hosts/default/variables.nix @@ -0,0 +1,113 @@ +{ + # Git Configuration ( For Pulling Software Repos ) + gitUsername = "user"; + gitEmail = "user@example.com"; + + # System Configuration + timeZone = "America/New_York"; + + # Hyprland Settings + # ex "monitor=HDMI-A-1, 1920x1080@60,auto,1" + # Configure your monitors here - this is host-specific + extraMonitorSettings = '' + monitor=,preferred,auto,1 + ''; + + # Waybar Settings + clock24h = false; + + # Program Options + browser = "zen"; # Set Default Browser (google-chrome-stable for google-chrome) + terminal = "kitty"; # Set Default System Terminal + keyboardLayout = "us"; + consoleKeyMap = "us"; + + # For Nvidia Prime support + # Run 'lspci | grep VGA' to find your actual GPU IDs + intelID = "PCI:0:2:0"; # Update with your integrated GPU ID + nvidiaID = "PCI:1:0:0"; # Update with your NVIDIA GPU ID + + # Enable Nvidia cudaSupport for specific applications (obs-studio) + useNvidia = false; + + # Enable NFS + enableNFS = true; + + # Enable Printing Support + printEnable = false; + + # Enable Thunar GUI File Manager + thunarEnable = true; + + # Enable Gaming Support (controllers, gamescope, protonup-qt) + gamingSupportEnable = false; + + # Enable Flutter Development Environment + flutterdevEnable = false; + + # Enable Stylix System Theming + stylixEnable = true; + + # Enable Syncthing File Synchronization + syncthingEnable = false; + + # Enable Communication Apps (Teams, Zoom, Telegram, Discord) + enableCommunicationApps = false; + + # Enable Extra Browsers (Chromium, Google Chrome) + enableExtraBrowsers = false; + + # Enable Productivity Apps (Obsidian, GNOME Boxes, QuickEmu) + enableProductivityApps = false; + + # Enable AI Code Editors (cursor, claude-code, gemini-cli) + aiCodeEditorsEnable = false; + + # Enable Hyprlock (Hyprland lock screen) + # Set to false if using DMS or Noctalia lock screens + enableHyprlock = false; + + # Bar/Shell Choice + barChoice = "noctalia"; # Options: "dms" or "noctalia" + # NOTE: If you change barChoice to "dms", you must run 'dms-install' after rebuilding + + # Shell Choice + defaultShell = "zsh"; # Options: "fish" or "zsh" + + # Set Stylix Image + #stylixImage = ../../wallpapers/AnimeGirlNightSky.jpg; + #stylixImage = ../../wallpapers/nix-wallpaper-stripes-logo.png; + #stylixImage = ../../wallpapers/beautifulmountainscape.png; + #stylixImage = ../../wallpapers/mountainscapedark.jpg; + #stylixImage = ../../wallpapers/Rainnight.jpg; + #stylixImage = ../../wallpapers/zaney-wallpaper.jpg; + stylixImage = ../../wallpapers/55.png; + + # Set Waybar (temporarily disabled - use DMS or Noctalia) + # Includes alternates such as: + # Just uncomment the one you want and comment out the others + + #waybarChoice = ../../modules/home/waybar/Jerry-waybars.nix; + #waybarChoice = ../../modules/home/waybar/waybar-simple.nix; + #waybarChoice = ../../modules/home/waybar/waybar-curved.nix; + #waybarChoice = ../../modules/home/waybar/waybar-nekodyke.nix; + #waybarChoice = ../../modules/home/waybar/waybar-jerry.nix; + #waybarChoice = ../../modules/home/waybar/waybar-ddubs.nix; + + # Set Animation style + # Available options are: + # animations-def.nix (standard) + # animations-end4.nix (end-4 project) + # animations-dynamic.nix (ml4w project) + # animations-moving.nix (ml4w project) + # Just change the name after the - and rebuild + animChoice = ../../modules/home/hyprland/animations-end4.nix; + #animChoice = ../../modules/home/hyprland/animations-def.nix; + #animChoice = ../../modules/home/hyprland/animations-dynamix.nix; + # Note: Moving changes window resizing it shrinks then pops back + #animChoice = ../../modules/home/hyprland/animations-moving.nix; + + # Startup Applications + startupApps = [ + ]; +} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..2192e8f --- /dev/null +++ b/install.sh @@ -0,0 +1,504 @@ +#!/usr/bin/env bash + +###################################### +# Black Don OS - Simplified Installer (Modified) +# A NixOS configuration for everyone +###################################### + +set -e # Exit on error + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Print functions +print_header() { + echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ ${1}${NC}" + echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}" +} + +print_error() { + echo -e "${RED}✗ Error: ${1}${NC}" +} + +print_success() { + echo -e "${GREEN}✓ ${1}${NC}" +} + +print_info() { + echo -e "${BLUE}ℹ ${1}${NC}" +} + +# Welcome +clear +print_header "Cookiez NixOS - Simplified Installation" +echo "" +echo -e "${BLUE}Welcome! This installer will set up NixOS with sensible defaults.${NC}" +echo -e "${BLUE}You can customize everything later by editing your variables.nix file.${NC}" +echo "" +sleep 2 + +# Verify NixOS +print_header "System Verification" +if [ -n "$(grep -i nixos < /etc/os-release)" ]; then + print_success "Running on NixOS" +else + print_error "This installer requires NixOS" + exit 1 +fi + +# Check dependencies +if ! command -v git &> /dev/null || ! command -v lspci &> /dev/null; then + print_error "Missing dependencies. Please run:" + echo -e " ${GREEN}nix-shell -p git pciutils${NC}" + exit 1 +fi +print_success "All dependencies found" +echo "" + +# Get hostname +print_header "Hostname Configuration" +echo -e "${YELLOW}⚠️ Do NOT use 'default' as your hostname!${NC}" +echo -e "Suggested names: my-desktop, nixos-laptop, gaming-rig" +echo "" + +while true; do + read -p "Enter hostname [nixos]: " hostname + hostname=${hostname:-nixos} + + if [ "$hostname" = "default" ]; then + print_error "Cannot use 'default' as hostname. Choose something else." + continue + fi + + if [[ ! "$hostname" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$ ]]; then + print_error "Invalid hostname. Use only letters, numbers, and hyphens." + continue + fi + + break +done + +print_success "Hostname: $hostname" +echo "" + +# Get username +print_header "User Configuration" +current_user=$(echo $USER) +read -p "Enter username [$current_user]: " username +username=${username:-$current_user} +print_success "Username: $username" +echo "" + +# Get timezone +print_header "Timezone Configuration" +echo -e "${BLUE}Common timezones:${NC}" +echo -e " America/New_York (Eastern)" +echo -e " America/Chicago (Central)" +echo -e " America/Denver (Mountain)" +echo -e " America/Los_Angeles (Pacific)" +echo -e " Europe/London" +echo -e " Europe/Berlin" +echo -e " Asia/Tokyo" +echo -e " Australia/Sydney" +echo "" +echo -e "${YELLOW}Tip: Find your timezone at: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones${NC}" +echo "" +read -p "Enter timezone [Europe/Berlin]: " timezone +timezone=${timezone:-Europe/Berlin} +print_success "Timezone: $timezone" +echo "" + +# Get keyboard layout +print_header "Keyboard Configuration" +echo -e "${BLUE}Common keyboard layouts:${NC}" +echo -e " us (US English)" +echo -e " uk (UK English)" +echo -e " de (German)" +echo -e " fr (French)" +echo -e " es (Spanish)" +echo -e " it (Italian)" +echo -e " jp (Japanese)" +echo -e " ru (Russian)" +echo "" +read -p "Enter keyboard layout [de]: " keyboard +keyboard=${keyboard:-de} +print_success "Keyboard layout: $keyboard" +echo "" + +# Detect GPU +print_header "Hardware Detection" +DETECTED_PROFILE="" + +has_nvidia=false +has_intel=false +has_amd=false +has_vm=false + +if lspci | grep -qi 'vga\|3d'; then + while read -r line; do + if echo "$line" | grep -qi 'nvidia'; then + has_nvidia=true + elif echo "$line" | grep -qi 'amd'; then + has_amd=true + elif echo "$line" | grep -qi 'intel'; then + has_intel=true + elif echo "$line" | grep -qi 'virtio\|vmware'; then + has_vm=true + fi + done < <(lspci | grep -i 'vga\|3d') + + if $has_vm; then + DETECTED_PROFILE="vm" + elif $has_nvidia && $has_intel; then + DETECTED_PROFILE="nvidia-laptop" + elif $has_nvidia; then + DETECTED_PROFILE="nvidia" + elif $has_amd; then + DETECTED_PROFILE="amd" + elif $has_intel; then + DETECTED_PROFILE="intel" + fi +fi + +if [ -z "$DETECTED_PROFILE" ]; then + echo -e "${YELLOW}Could not detect GPU automatically${NC}" + echo "Available profiles: nvidia, nvidia-laptop, amd, intel, vm" + read -p "Enter GPU profile [amd]: " profile + profile=${profile:-amd} +else + echo -e "Detected GPU: ${GREEN}$DETECTED_PROFILE${NC}" + read -p "Is this correct? [Y/n]: " confirm + if [[ $confirm =~ ^[Nn]$ ]]; then + echo "Available profiles: nvidia, nvidia-laptop, amd, intel, vm" + read -p "Enter GPU profile: " profile + else + profile=$DETECTED_PROFILE + fi +fi + +print_success "GPU Profile: $profile" +echo "" + +# Configuration summary +print_header "Configuration Summary" +echo -e " Hostname: ${GREEN}$hostname${NC}" +echo -e " Username: ${GREEN}$username${NC}" +echo -e " Timezone: ${GREEN}$timezone${NC}" +echo -e " Keyboard: ${GREEN}$keyboard${NC}" +echo -e " GPU Profile: ${GREEN}$profile${NC}" +echo "" +# echo -e "${BLUE}Default Settings (you can change these later):${NC}" +# echo -e " Browser: firefox" +# echo -e " Terminal: kitty" +# echo -e " Shell: zsh" +# echo -e " Bar: noctalia" +# echo -e " Window Mgrs: Both Hyprland and Niri (choose at login)" +# echo "" + +read -p "Continue with installation? [Y/n]: " proceed +if [[ $proceed =~ ^[Nn]$ ]]; then + echo "Installation cancelled" + exit 0 +fi + +# Generate hardware config +print_header "Generating Hardware Configuration" +sudo nixos-generate-config --show-hardware-config > /tmp/hardware.nix +print_success "Hardware configuration generated" +echo "" + +# Create host directory +print_header "Creating Host Configuration" +mkdir -p "hosts/$hostname" + +# Copy default template +cp hosts/default/*.nix "hosts/$hostname/" 2>/dev/null || true + +# Copy hardware config +mv /tmp/hardware.nix "hosts/$hostname/hardware.nix" + +# Create variables.nix +cat > "hosts/$hostname/variables.nix" << EOF +{ + # Git Configuration + gitUsername = "$username"; + gitEmail = "$username@$hostname"; + + # System Configuration + timeZone = "$timezone"; + +# # Monitor Settings (update after installation for your displays) +# extraMonitorSettings = '' +# monitor=,preferred,auto,1 +# ''; + +# # Waybar Settings +# clock24h = false; + + # Default Applications + browser = "firefox"; + terminal = "kitty"; + keyboardLayout = "$keyboard"; + consoleKeyMap = "$keyboard"; + +# # For Nvidia Prime support (update if using nvidia-laptop profile) +# # Run 'lspci | grep VGA' to find your actual GPU IDs +# intelID = "PCI:0:2:0"; +# nvidiaID = "PCI:1:0:0"; + +# # Core Features +# enableNFS = false; +# printEnable = false; +# thunarEnable = true; +# stylixEnable = true; + +# # Optional Features (disabled for faster initial install) +# # You can enable these later by setting to true and rebuilding +# gamingSupportEnable = false; # Gaming controllers, gamescope, protonup-qt +# flutterdevEnable = false; # Flutter development environment +# syncthingEnable = false; # Syncthing file synchronization +# enableCommunicationApps = false; # Discord, Teams, Zoom, Telegram +# enableExtraBrowsers = false; # Vivaldi, Brave, Firefox, Chromium, Helium +# enableProductivityApps = false; # Obsidian, GNOME Boxes, QuickEmu +# aiCodeEditorsEnable = false; # Claude-code, gemini-cli, cursor + +# # Desktop Environment +# enableHyprlock = false; # Set to false if using DMS/Noctalia lock screens + +# # Bar/Shell Choice +# barChoice = "noctalia"; # Options: "dms" or "noctalia" +# # NOTE: If you change barChoice to "dms", you must run 'dms-install' after rebuilding + + # Shell Choice + defaultShell = "zsh"; # Options: "fish" or "zsh" + + # Theming + stylixImage = ../../other/wallpaper2.png; +# #waybarChoice = ../../modules/home/waybar/waybar-ddubs.nix; # Waybar temporarily disabled +# animChoice = ../../modules/home/hyprland/animations-end4.nix; + +# # Startup Applications +# startupApps = []; +} +EOF + +print_success "Host configuration created" +echo "" + +# # Create Hyprland host-specific configuration files +# print_header "Creating Window Manager Host Configurations" +# mkdir -p "modules/home/hyprland/hosts/$hostname" +# +# # Create binds.nix for Hyprland +# cat > "modules/home/hyprland/hosts/$hostname/binds.nix" << 'EOF' +# {host, ...}: let +# inherit +# (import ../../../../hosts/${host}/variables.nix) +# browser +# terminal +# ; +# in { +# # Host-specific binds for $HOSTNAME +# # These will be merged with the default binds +# bind = [ +# # Add host-specific keybinds here +# ]; +# +# bindm = [ +# # Add host-specific mouse binds here +# ]; +# } +# EOF +# +# # Replace $HOSTNAME placeholder with actual hostname +# sed -i "s/\$HOSTNAME/$hostname/g" "modules/home/hyprland/hosts/$hostname/binds.nix" +# +# # Create windowrules.nix for Hyprland +# cat > "modules/home/hyprland/hosts/$hostname/windowrules.nix" << 'EOF' +# {host, ...}: let +# inherit +# (import ../../../../hosts/${host}/variables.nix) +# extraMonitorSettings +# ; +# in { +# # Host-specific window rules for $HOSTNAME +# # These will be merged with the default window rules +# windowrule = [ +# # Add host-specific window rules here +# ]; +# } +# EOF +# +# # Replace $HOSTNAME placeholder with actual hostname +# sed -i "s/\$HOSTNAME/$hostname/g" "modules/home/hyprland/hosts/$hostname/windowrules.nix" +# +# print_success "Hyprland configurations created" + +# # Create Niri host-specific configuration files +# mkdir -p "modules/home/niri/hosts/$hostname" +# +# # Create keybinds.nix for Niri +# cat > "modules/home/niri/hosts/$hostname/keybinds.nix" << 'EOF' +# { host, ... }: +# '' +# // Host-specific keybinds for $HOSTNAME +# // Add your custom keybinds here +# +# // Example: +# // binds { +# // Mod+Shift+B { spawn "zen"; } +# // } +# '' +# EOF +# +# sed -i "s/\$HOSTNAME/$hostname/g" "modules/home/niri/hosts/$hostname/keybinds.nix" +# +# # Create outputs.nix for Niri +# cat > "modules/home/niri/hosts/$hostname/outputs.nix" << 'EOF' +# { host, ... }: +# '' +# // Host-specific output configuration for $HOSTNAME +# // Configure your monitors here +# +# output "eDP-1" { +# mode "1920x1080@60.000" +# scale 1.0 +# position x=0 y=0 +# } +# +# // Add more outputs as needed +# // output "HDMI-A-1" { +# // mode "2560x1440@144.000" +# // scale 1.0 +# // position x=1920 y=0 +# // } +# '' +# EOF +# +# sed -i "s/\$HOSTNAME/$hostname/g" "modules/home/niri/hosts/$hostname/outputs.nix" +# +# # Create windowrules.nix for Niri +# cat > "modules/home/niri/hosts/$hostname/windowrules.nix" << 'EOF' +# { host, ... }: +# '' +# // Host-specific window rules for $HOSTNAME +# // Add your custom window rules here +# +# // Example: +# // window-rule { +# // match app-id="^firefox$" +# // default-column-width { proportion 0.5; } +# // } +# '' +# EOF +# +# sed -i "s/\$HOSTNAME/$hostname/g" "modules/home/niri/hosts/$hostname/windowrules.nix" +# +# print_success "Niri configurations created" +# echo "" + +# # Add new host files to git so flake can see them +# git add hosts/"$hostname"/ modules/home/hyprland/hosts/"$hostname"/ modules/home/niri/hosts/"$hostname"/ 2>/dev/null || true +git add hosts/"$hostname"/ 2>/dev/null || true + +# Update flake.nix +print_header "Updating Flake Configuration" + +if grep -q "\"$hostname\"" flake.nix; then + print_info "Host already exists in flake.nix" +else + # Add host to flake.nix right after the default host + # Use awk to insert at the right location (after default host closing brace, before nixosConfigurations closing brace) + awk -v hostname="$hostname" -v profile="$profile" -v username="$username" ' + /username = "user";/ { in_default = 1 } + in_default && /^ };$/ { + print + print "" + print " " hostname " = mkHost {" + print " hostname = \"" hostname "\";" + print " profile = \"" profile "\";" + print " username = \"" username "\";" + print " };" + in_default = 0 + next + } + { print } + ' flake.nix > flake.nix.tmp && mv flake.nix.tmp flake.nix + + print_success "Added $hostname to flake.nix" + + # Add updated flake.nix to git + git add flake.nix 2>/dev/null || true +fi +echo "" + +# Validate flake +print_header "Validating Configuration" +export NIX_CONFIG="experimental-features = nix-command flakes" +if nix flake metadata --no-write-lock-file . >/dev/null 2>&1; then + print_success "Flake syntax is valid" +else + print_error "Flake validation failed - please check configuration" + exit 1 +fi +echo "" + +# Build configuration +print_header "Building Black Don OS" +echo -e "${YELLOW}This will take 10-20 minutes depending on your hardware...${NC}" +echo "" + +read -p "Ready to build? [Y/n]: " build_confirm +if [[ $build_confirm =~ ^[Nn]$ ]]; then + echo "" + print_info "You can build manually later with:" + echo -e " ${GREEN}sudo nixos-rebuild switch --flake ~/black-don-os#$hostname${NC}" + exit 0 +fi + +export NIX_CONFIG="experimental-features = nix-command flakes" + +if sudo nixos-rebuild switch --flake .#"$hostname"; then + echo "" + print_header "Installation Successful!" + echo "" + print_success "Black Don OS has been installed!" + echo "" +# echo -e "${BLUE}What's next:${NC}" +# echo -e " 1. Your configuration is in: ${GREEN}~/black-don-os/hosts/$hostname/${NC}" +# echo -e " 2. Both Hyprland and Niri are available - select at login screen" +# echo -e " 3. Customize: ${GREEN}~/black-don-os/hosts/$hostname/variables.nix${NC}" +# echo -e " 4. Rebuild: ${GREEN}sudo nixos-rebuild switch --flake ~/black-don-os#$hostname${NC}" +# echo "" +# echo -e "${YELLOW}Tip: Update your monitor settings in variables.nix for optimal display${NC}" +# echo "" + echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║${NC} ${YELLOW}IMPORTANT: A system restart is required to complete setup${NC} ${GREEN}║${NC}" + echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}" + echo "" + read -p "Would you like to restart now? [Y/n]: " restart_confirm + if [[ ! $restart_confirm =~ ^[Nn]$ ]]; then + echo "" + print_info "Restarting system in 5 seconds... (Ctrl+C to cancel)" + sleep 5 + sudo reboot + else + echo "" + print_info "Please restart your system when ready to complete the installation" + echo -e " Run: ${GREEN}sudo reboot${NC}" + fi + echo "" +else + echo "" + print_error "Build failed" + echo "" + echo -e "${YELLOW}To retry manually:${NC}" + echo -e " ${GREEN}cd ~/black-don-os${NC}" + echo -e " ${GREEN}sudo nixos-rebuild switch --flake .#$hostname${NC}" + exit 1 +fi diff --git a/modules/boot-splash.nix b/modules/boot-splash.nix new file mode 100644 index 0000000..b112014 --- /dev/null +++ b/modules/boot-splash.nix @@ -0,0 +1,22 @@ +{ config, lib, pkgs, ... }: +{ + boot = { + # silence first boot output + consoleLogLevel = 3; + initrd.verbose = false; + initrd.systemd.enable = true; + kernelParams = [ + "quiet" + "splash" + "intremap=on" + "boot.shell_on_fail" + "udev.log_priority=3" + "rd.systemd.show_status=auto" + ]; + + # plymouth, showing after LUKS unlock + plymouth.enable = true; + plymouth.font = "${pkgs.hack-font}/share/fonts/truetype/Hack-Regular.ttf"; + plymouth.logo = "${pkgs.nixos-icons}/share/icons/hicolor/128x128/apps/nix-snowflake.png"; + }; +} diff --git a/configuration.nix b/modules/configuration.nix similarity index 91% rename from configuration.nix rename to modules/configuration.nix index 619467a..c71444f 100644 --- a/configuration.nix +++ b/modules/configuration.nix @@ -10,7 +10,7 @@ #Nix flake file limit: ulimit -n 500000 -{ config, pkgs, lib, username, version, ... }: +{ inputs, config, pkgs, lib, username, version, system, ... }: { # stylix.enable = true; # stylix.image = /etc/nixos/other/wallpaper.png; @@ -23,6 +23,7 @@ imports = [ + inputs.home-manager.nixosModules.home-manager ./hardware-configuration.nix ]; @@ -30,7 +31,7 @@ "plasma" = { configuration = { imports = [ - ./plasma/plasma.nix + ../plasma/plasma.nix ]; programs.gamemode.enable = true; @@ -40,19 +41,19 @@ "hyprland" = { configuration = { imports = [ - ./hyprland/hyprland.nix + ../hyprland/hyprland.nix ]; }; }; - "minimal" = { - inheritParentConfig = false; - configuration = { - imports = [ - ./minimal.nix - ]; - }; - }; + #"minimal" = { + # inheritParentConfig = false; + # configuration = { + # imports = [ + # ./minimal.nix + # ]; + # }; + #}; }; @@ -92,6 +93,14 @@ # networking.proxy.default = "http://user:password@proxy:port/"; # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.${username} = ./home.nix; + backupFileExtension = "backup"; # Automatically backs up conflicting files during activation + extraSpecialArgs = { inherit inputs username version system; }; + }; + # Enable networking networking.networkmanager.enable = true; @@ -219,7 +228,7 @@ # services.xserver.libinput.enable = true; # Define a user account. Don't forget to set a password with ‘passwd’. - users.users.cookiez = { + users.users."{$username}" = { isNormalUser = true; description = "Cookiez"; extraGroups = [ "networkmanager" "wheel" "docker" ]; diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..2bcb401 --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,11 @@ +{ ... }: +{ + imports = [ + ./configuration.nix + ./firefox.nix + ./boot-splash.nix + ./zsh.nix + ./neovim.nix + ./packages.nix + ]; +} diff --git a/desktop-entries.nix b/modules/desktop-entries.nix similarity index 100% rename from desktop-entries.nix rename to modules/desktop-entries.nix diff --git a/firefox.nix b/modules/firefox.nix similarity index 100% rename from firefox.nix rename to modules/firefox.nix diff --git a/hardware-configuration.nix b/modules/hardware-configuration.nix similarity index 100% rename from hardware-configuration.nix rename to modules/hardware-configuration.nix diff --git a/home.nix b/modules/home.nix similarity index 100% rename from home.nix rename to modules/home.nix diff --git a/minimal.nix b/modules/minimal.nix similarity index 100% rename from minimal.nix rename to modules/minimal.nix diff --git a/neovim-home.nix b/modules/neovim-home.nix similarity index 100% rename from neovim-home.nix rename to modules/neovim-home.nix diff --git a/neovim.nix b/modules/neovim.nix similarity index 100% rename from neovim.nix rename to modules/neovim.nix diff --git a/packages.nix b/modules/packages.nix similarity index 100% rename from packages.nix rename to modules/packages.nix diff --git a/zsh.nix b/modules/zsh.nix similarity index 67% rename from zsh.nix rename to modules/zsh.nix index e6c0dd2..f682b7c 100644 --- a/zsh.nix +++ b/modules/zsh.nix @@ -3,19 +3,18 @@ enable = true; ohMyZsh = { - enable = true; - plugins = [ "git" ]; + enable = true; + plugins = [ "git" ]; }; shellInit = '' - source /etc/nixos/other/aliases - ''; - + source /etc/nixos/other/aliases + ''; #To reset powerlevel10k, write 'p10k configure' in shell! promptInit = '' - source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme - ''; + source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme + ''; }; users.users.cookiez.shell = pkgs.zsh;