NixOS Migration - Complete Configuration

⚠️ CRITICAL FIXES:

Table of Contents

System Configuration Files (/etc/nixos/)

πŸ“ These files go in /etc/nixos/ and require sudo to edit
/etc/nixos/configuration.nix
Main NixOS configuration that imports all modules
{ config, pkgs, ... }:

{
  imports = [
    # Hardware configuration
    ./hardware-configuration.nix
    
    # Custom modules
    ./modules/hardware.nix
    ./modules/boot.nix
    ./modules/networking.nix
    ./modules/audio.nix
    ./modules/hyprland.nix
    ./modules/packages.nix
    ./modules/shell.nix
    ./modules/users.nix
    ./modules/fonts.nix
  ];

  # System version - DON'T CHANGE
  system.stateVersion = "24.05";
  
  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;
  
  # Time zone and locale
  time.timeZone = "America/New_York"; # CHANGE THIS to your timezone
  i18n.defaultLocale = "en_US.UTF-8";
}

NixOS Modules (/etc/nixos/modules/)

sudo mkdir -p /etc/nixos/modules
/etc/nixos/modules/hardware.nix
Hardware configuration: graphics, firmware, SSD optimization
{ config, pkgs, ... }:

{
  # Enable OpenGL
  hardware.opengl = {
    enable = true;
    driSupport = true;
    driSupport32Bit = true;
    
    # Additional video acceleration
    extraPackages = with pkgs; [
      intel-media-driver # For Intel GPUs
      vaapiIntel        # For older Intel GPUs
      vaapiVdpau
      libvdpau-va-gl
    ];
  };
  
  # Enable firmware updates
  services.fwupd.enable = true;
  
  # CPU microcode updates
  hardware.cpu.intel.updateMicrocode = true; # Or hardware.cpu.amd.updateMicrocode for AMD
  
  # Enable SSD TRIM
  services.fstrim.enable = true;
}
/etc/nixos/modules/boot.nix
Bootloader and kernel configuration
{ config, pkgs, ... }:

{
  # Bootloader configuration
  boot.loader = {
    systemd-boot.enable = true;
    efi.canTouchEfiVariables = true;
    
    # Show boot menu for 3 seconds
    timeout = 3;
  };
  
  # Kernel parameters
  boot.kernelParams = [
    "quiet"
    "splash"
    # Add "nvidia-drm.modeset=1" if using NVIDIA
  ];
  
  # Use latest kernel
  boot.kernelPackages = pkgs.linuxPackages_latest;
  
  # Enable NTFS support (for dual boot)
  boot.supportedFilesystems = [ "ntfs" ];
  
  # Cleaning /tmp on boot
  boot.tmp.cleanOnBoot = true;
}
/etc/nixos/modules/networking.nix
Network configuration and firewall
{ config, pkgs, ... }:

{
  # Hostname
  networking.hostName = "nixos"; # CHANGE THIS to your preferred hostname
  
  # NetworkManager for easy WiFi management
  networking.networkmanager.enable = true;
  
  # Enable firewall
  networking.firewall = {
    enable = true;
    allowedTCPPorts = [ 
      # 22  # SSH - uncomment if needed
    ];
    allowedUDPPorts = [ ];
  };
  
  # Enable mDNS for local network discovery
  services.avahi = {
    enable = true;
    nssmdns4 = true;
    openFirewall = true;
  };
  
  # Optimize network performance
  boot.kernel.sysctl = {
    "net.ipv4.tcp_congestion_control" = "bbr";
    "net.core.default_qdisc" = "cake";
  };
}
/etc/nixos/modules/audio.nix
PipeWire audio configuration
{ config, pkgs, ... }:

{
  # Enable sound
  sound.enable = true;
  
  # Disable PulseAudio (we'll use PipeWire)
  hardware.pulseaudio.enable = false;
  
  # Enable realtime scheduling for audio
  security.rtkit.enable = true;
  
  # PipeWire configuration
  services.pipewire = {
    enable = true;
    
    # Enable ALSA support
    alsa = {
      enable = true;
      support32Bit = true;
    };
    
    # PulseAudio compatibility
    pulse.enable = true;
    
    # JACK compatibility
    jack.enable = true;
    
    # WirePlumber (PipeWire session manager)
    wireplumber.enable = true;
  };
  
  # Audio-related packages
  environment.systemPackages = with pkgs; [
    pavucontrol      # GUI volume control
    pamixer          # CLI volume control
    playerctl        # Media player control
    pulseaudio       # For pactl commands
  ];
}
/etc/nixos/modules/hyprland.nix
Hyprland Wayland compositor setup
{ config, pkgs, ... }:

{
  # Enable Hyprland
  programs.hyprland = {
    enable = true;
    xwayland.enable = true;
  };
  
  # XDG Desktop Portal
  xdg.portal = {
    enable = true;
    wlr.enable = true;
    extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
    config.common.default = "*";
  };
  
  # Session variables for Wayland
  environment.sessionVariables = {
    # Wayland specific
    NIXOS_OZONE_WL = "1";             # Enable Wayland for Electron apps
    MOZ_ENABLE_WAYLAND = "1";         # Enable Wayland for Firefox
    QT_QPA_PLATFORM = "wayland";      # Qt apps use Wayland
    SDL_VIDEODRIVER = "wayland";      # SDL apps use Wayland
    CLUTTER_BACKEND = "wayland";      # Clutter apps use Wayland
    
    # XDG specifications
    XDG_CURRENT_DESKTOP = "Hyprland";
    XDG_SESSION_TYPE = "wayland";
    XDG_SESSION_DESKTOP = "Hyprland";
    
    # Cursor
    WLR_NO_HARDWARE_CURSORS = "1";    # Fix cursor issues
    
    # Editor
    EDITOR = "hx";
    VISUAL = "hx";
    BROWSER = "firefox";
  };
  
  # Display manager - Using greetd with tuigreet
  services.greetd = {
    enable = true;
    settings = {
      default_session = {
        command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --remember --cmd Hyprland";
        user = "greeter";
      };
    };
  };
  
  # Hyprland-specific packages
  environment.systemPackages = with pkgs; [
    # Wayland utilities
    wayland-utils
    wl-clipboard
    wlr-randr
    
    # Screenshot tools
    grim
    slurp
    
    # Wallpaper
    swww
    
    # Notifications
    dunst
    libnotify
    
    # App launcher
    rofi-wayland
    
    # Status bar
    waybar
    
    # Authentication agent
    polkit_gnome
    
    # Screen brightness control
    brightnessctl
    
    # Idle management
    swayidle
    swaylock-effects
  ];
  
  # Enable polkit
  security.polkit.enable = true;
  
  # Start polkit agent with Hyprland
  systemd.user.services.polkit-gnome-authentication-agent-1 = {
    description = "polkit-gnome-authentication-agent-1";
    wantedBy = [ "graphical-session.target" ];
    wants = [ "graphical-session.target" ];
    after = [ "graphical-session.target" ];
    serviceConfig = {
      Type = "simple";
      ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
      Restart = "on-failure";
      RestartSec = 1;
      TimeoutStopSec = 10;
    };
  };
}
/etc/nixos/modules/packages.nix
General system packages
{ config, pkgs, ... }:

{
  environment.systemPackages = with pkgs; [
    # Core utilities
    wget
    curl
    git
    vim
    htop
    btop
    neofetch
    unzip
    zip
    tree
    file
    which
    gnumake
    gcc
    
    # Modern CLI tools (replacements)
    ripgrep      # Better grep
    fd           # Better find
    eza          # Better ls
    bat          # Better cat
    delta        # Better git diff
    duf          # Better df
    dust         # Better du
    
    # Development tools
    helix
    neovim
    lazygit
    gh           # GitHub CLI
    jq           # JSON processor
    yq           # YAML processor
    
    # Terminal emulators
    foot
    kitty        # Backup option
    
    # File management
    yazi         # Terminal file manager
    xdg-utils    # xdg-open, etc.
    
    # Network tools
    nmap
    traceroute
    dig
    netcat
    
    # System monitoring
    iotop
    iftop
    nethogs
    
    # Archive tools
    p7zip
    unrar
    
    # Media tools
    ffmpeg
    imagemagick
    
    # Browsers
    firefox
    chromium
    
    # GUI text editors
    kate         # KDE text editor
    
    # Communication
    discord
    slack
    
    # Office
    libreoffice
    
    # Media players
    vlc
    mpv
    
    # Image viewers
    feh
    imv
    
    # PDF viewer
    zathura
    
    # System utilities
    gparted
    ventoy        # USB boot tool
    
    # Virtualization (optional)
    # virt-manager
    # qemu
    
    # Development languages/tools (add as needed)
    # rustup
    # go
    # nodejs
    # python3
    # docker
  ];
}
/etc/nixos/modules/shell.nix
Fish shell system configuration
{ config, pkgs, ... }:

{
  # Enable Fish shell system-wide
  programs.fish.enable = true;
  
  # Fish plugins and configuration
  programs.fish = {
    shellAliases = {
      # Directory navigation
      ".." = "cd ..";
      "..." = "cd ../..";
      "...." = "cd ../../..";
      home = "cd ~";
      
      # Git aliases
      g = "lazygit";
      gs = "git status";
      ga = "git add";
      gc = "git commit";
      gp = "git push";
      gl = "git pull";
      gd = "git diff";
      glog = "git log --oneline --graph --decorate";
      
      # Modern CLI replacements
      ls = "eza --icons";
      ll = "eza -la --icons";
      la = "eza -a --icons";
      lt = "eza --tree --icons";
      cat = "bat";
      find = "fd";
      grep = "rg";
      
      # System management
      rebuild = "sudo nixos-rebuild switch";
      update = "sudo nix-channel --update";
      upgrade = "sudo nixos-rebuild switch --upgrade";
      gc = "sudo nix-collect-garbage -d";
      optimize = "sudo nix-store --optimize";
      
      # Convenience
      c = "clear";
      x = "exit";
      v = "hx";  # Use helix
      n = "yazi";
      
      # Safety aliases
      cp = "cp -i";
      mv = "mv -i";
      rm = "rm -i";
      
      # Colorful commands
      ip = "ip --color=auto";
      diff = "diff --color=auto";
      
      # Quick edits
      conf = "cd ~/.config";
      nixconf = "cd /etc/nixos";
      
      # SSH with proper TERM
      ssh = "env TERM=xterm-256color ssh";
    };
    
    # Interactive shell init
    interactiveShellInit = ''
      # Disable greeting
      set -g fish_greeting
      
      # Initialize starship
      ${pkgs.starship}/bin/starship init fish | source
      
      # Initialize zoxide
      ${pkgs.zoxide}/bin/zoxide init fish | source
      
      # Set color variables (Sonokai theme)
      set -gx BLACK 0xff181819
      set -gx WHITE 0xffe2e2e3
      set -gx RED 0xfffc5d7c
      set -gx GREEN 0xff9ed072
      set -gx BLUE 0xff76cce0
      set -gx YELLOW 0xffe7c664
      set -gx ORANGE 0xfff39660
      set -gx MAGENTA 0xffb39df3
      set -gx GREY 0xff7f8490
      set -gx TRANSPARENT 0x00000000
      set -gx BG0 0xff2c2e34
      set -gx BG1 0xff363944
      set -gx BG2 0xff414550
      
      # Better ls after cd
      function cd
          builtin cd $argv
          and eza --icons
      end
      
      # Quick navigation with zoxide
      function z
          __zoxide_z $argv
          and eza --icons
      end
      
      # Extract archives
      function extract
          switch $argv[1]
              case '*.tar.bz2'
                  tar xjf $argv[1]
              case '*.tar.gz'
                  tar xzf $argv[1]
              case '*.bz2'
                  bunzip2 $argv[1]
              case '*.rar'
                  unrar x $argv[1]
              case '*.gz'
                  gunzip $argv[1]
              case '*.tar'
                  tar xf $argv[1]
              case '*.tbz2'
                  tar xjf $argv[1]
              case '*.tgz'
                  tar xzf $argv[1]
              case '*.zip'
                  unzip $argv[1]
              case '*.Z'
                  uncompress $argv[1]
              case '*.7z'
                  7z x $argv[1]
              case '*'
                  echo "'$argv[1]' cannot be extracted"
          end
      end
      
      # Keybindings
      bind \cf 'zi'  # Ctrl+F for interactive zoxide
    '';
  };
  
  # Bash as backup shell
  programs.bash = {
    enableCompletion = true;
    # Basic aliases for bash users
    shellAliases = config.programs.fish.shellAliases;
  };
  
  # Shell-related packages
  environment.systemPackages = with pkgs; [
    # Shell and plugins
    fish
    fishPlugins.done
    fishPlugins.fzf-fish
    fishPlugins.forgit
    fishPlugins.autopair
    
    # Shell enhancements
    starship      # Prompt
    zoxide        # Better cd
    fzf           # Fuzzy finder
    direnv        # Environment management
    tmux          # Terminal multiplexer
  ];
}
/etc/nixos/modules/users.nix
User account configuration
{ config, pkgs, ... }:

{
  # Define user accounts
  users.users.mike = {  # CHANGE 'mike' to your username
    isNormalUser = true;
    description = "Mike";  # CHANGE to your name
    
    # User groups
    extraGroups = [
      "wheel"           # sudo access
      "networkmanager"  # Network configuration
      "video"           # Video device access
      "audio"           # Audio device access
      "input"           # Input device access
      "disk"            # Disk device access
      "libvirtd"        # Virtualization (if needed)
      "docker"          # Docker (if needed)
    ];
    
    # Default shell
    shell = pkgs.fish;
    
    # Create home directory if it doesn't exist
    createHome = true;
    home = "/home/mike";  # CHANGE to match your username
    
    # Initial password (change it after first login!)
    # You can generate a hashed password with: mkpasswd -m sha-512
    # For now, this sets password to "changeme"
    initialPassword = "changeme";
  };
  
  # Allow wheel group to use sudo
  security.sudo = {
    enable = true;
    wheelNeedsPassword = true;  # Set to false if you want passwordless sudo
    
    # Custom sudo rules
    extraRules = [
      {
        groups = [ "wheel" ];
        commands = [
          {
            command = "/run/current-system/sw/bin/nixos-rebuild";
            options = [ "NOPASSWD" ];  # Allow passwordless nixos-rebuild
          }
        ];
      }
    ];
  };
  
  # User-specific environment variables
  environment.variables = {
    EDITOR = "hx";
    VISUAL = "hx";
  };
}
/etc/nixos/modules/fonts.nix
System fonts configuration
{ config, pkgs, ... }:

{
  # Font packages
  fonts.packages = with pkgs; [
    # Nerd Fonts (includes icons)
    (nerdfonts.override { 
      fonts = [ 
        "JetBrainsMono"
        "FiraCode" 
        "Hack"
        "RobotoMono"
        "SourceCodePro"
        "UbuntuMono"
      ]; 
    })
    
    # System fonts
    noto-fonts
    noto-fonts-cjk
    noto-fonts-emoji
    liberation_ttf
    
    # Icon fonts
    font-awesome
    material-icons
    
    # Microsoft compatibility fonts
    corefonts
    vistafonts
    
    # Programming fonts (non-nerd variants)
    fira-code
    jetbrains-mono
    hack-font
    
    # UI fonts
    inter
    roboto
    ubuntu_font_family
    
    # Terminal fonts
    terminus_font
    inconsolata
  ];
  
  # Font configuration
  fonts = {
    # Enable default fonts
    enableDefaultPackages = true;
    
    # Font settings
    fontconfig = {
      enable = true;
      
      # Default fonts
      defaultFonts = {
        serif = [ "Noto Serif" "Liberation Serif" ];
        sansSerif = [ "Inter" "Noto Sans" "Liberation Sans" ];
        monospace = [ "JetBrainsMono Nerd Font" "FiraCode Nerd Font" ];
        emoji = [ "Noto Color Emoji" ];
      };
      
      # Improve font rendering
      antialias = true;
      hinting = {
        enable = true;
        style = "slight";
      };
      
      subpixel = {
        rgba = "rgb";
        lcdfilter = "default";
      };
    };
  };
}

User Configuration Files (~/.config/)

πŸ“ These files go in your home directory under ~/.config/
mkdir -p ~/.config/hypr ~/.config/waybar ~/.config/foot ~/.config/fish
~/.config/hypr/hyprland.conf
Hyprland window manager configuration
# Hyprland Configuration
# Matching yabai + skhd behavior from macOS

# Monitor configuration
monitor=,preferred,auto,1

# Execute at launch
exec-once = waybar &
exec-once = dunst &
exec-once = swww init &
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &

# Input configuration
input {
    kb_layout = us
    follow_mouse = 1
    # sensitivity = 0.0    # Default - adjust if needed
    
    touchpad {
        natural_scroll = false
    }
}

# General configuration
general {
    gaps_in = 5
    gaps_out = 10
    border_size = 2
    col.active_border = rgba(9ed072ff) rgba(76cce0ff) 45deg
    col.inactive_border = rgba(595959aa)
    
    layout = dwindle
}

# Decoration
decoration {
    rounding = 8
    
    active_opacity = 1.0
    inactive_opacity = 0.8
    
    blur {
        enabled = true
        size = 3
        passes = 1
    }
    
    drop_shadow = true
    shadow_range = 4
    shadow_render_power = 3
    col.shadow = rgba(1a1a1aee)
}

# Animations (matching yabai's 0.5s duration)
animations {
    enabled = true
    
    bezier = myBezier, 0.05, 0.9, 0.1, 1.05
    
    animation = windows, 1, 7, myBezier
    animation = windowsOut, 1, 7, default, popin 80%
    animation = border, 1, 10, default
    animation = borderangle, 1, 8, default
    animation = fade, 1, 7, default
    animation = workspaces, 1, 6, default
}

# Layout configuration
dwindle {
    pseudotile = true
    preserve_split = true
}

master {
    new_is_master = true
}

gestures {
    workspace_swipe = false
}

# Window rules
windowrulev2 = opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$
windowrulev2 = noanim,class:^(xwaylandvideobridge)$
windowrulev2 = nofocus,class:^(xwaylandvideobridge)$
windowrulev2 = noinitialfocus,class:^(xwaylandvideobridge)$

# Floating windows
windowrulev2 = float,class:^(pavucontrol)$
windowrulev2 = float,class:^(nm-connection-editor)$
windowrulev2 = float,title:^(Picture-in-Picture)$

# Workspace rules - 10 workspaces like yabai
workspace = 1, default:true
workspace = 2
workspace = 3
workspace = 4
workspace = 5
workspace = 6
workspace = 7
workspace = 8
workspace = 9
workspace = 10

# Key bindings (matching yabai/skhd)
$mainMod = ALT

# Window Navigation: Alt + {j,k,l,ΓΆ}
bind = $mainMod, J, movefocus, l
bind = $mainMod, K, movefocus, d
bind = $mainMod, L, movefocus, u
bind = $mainMod, semicolon, movefocus, r  # Γ– key on US layout

# Extended navigation
bind = $mainMod, H, focuswindow, first
bind = $mainMod, apostrophe, focuswindow, last  # Γ„ key position

# Move windows: Shift + Alt + {j,k,l,ΓΆ}
bind = $mainMod SHIFT, J, movewindow, l
bind = $mainMod SHIFT, K, movewindow, d
bind = $mainMod SHIFT, L, movewindow, u
bind = $mainMod SHIFT, semicolon, movewindow, r

# Resize windows: Ctrl + Alt + {j,k,l,ΓΆ}
bind = $mainMod CTRL, J, resizeactive, -100 0
bind = $mainMod CTRL, K, resizeactive, 0 100
bind = $mainMod CTRL, L, resizeactive, 0 -100
bind = $mainMod CTRL, semicolon, resizeactive, 100 0

# Workspace switching: Alt + {1-9,0}
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10

# Move to workspace: Shift + Alt + {1-9,0}
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10

# Move between workspaces
bind = $mainMod SHIFT, P, movetoworkspace, -1
bind = $mainMod SHIFT, N, movetoworkspace, +1

# Window control
bind = $mainMod, Q, killactive
bind = $mainMod, SPACE, togglefloating
bind = $mainMod, F, fullscreen, 0
bind = $mainMod SHIFT, F, fullscreen, 1  # Maximize
bind = $mainMod, P, pseudo
bind = $mainMod SHIFT, S, togglesplit

# Mirror/rotate
bind = $mainMod SHIFT, X, layoutmsg, orientationcycle
bind = $mainMod SHIFT, Y, layoutmsg, orientationcycle

# Stack mode (similar to yabai)
bind = $mainMod CTRL, N, layoutmsg, cyclenext
bind = $mainMod CTRL, P, layoutmsg, cycleprev

# Balance windows
bind = $mainMod CTRL, E, layoutmsg, removemaster

# Toggle gaps
bind = $mainMod CTRL, G, exec, hyprctl keyword general:gaps_in 5 && hyprctl keyword general:gaps_out 10
bind = $mainMod CTRL SHIFT, G, exec, hyprctl keyword general:gaps_in 0 && hyprctl keyword general:gaps_out 0

# Application launching
bind = $mainMod, Return, exec, foot
bind = $mainMod, D, exec, rofi -show drun -show-icons
bind = $mainMod SHIFT, D, exec, rofi -show run
bind = $mainMod, V, exec, rofi -show window

# Split windows (like yabai)
bind = $mainMod, S, exec, hyprctl dispatch splitratio 0.5
bind = $mainMod, V, exec, hyprctl dispatch splitratio -0.5

# Exit Hyprland
bind = $mainMod SHIFT, E, exit

# Lock screen
bind = $mainMod SHIFT, L, exec, swaylock

# Screenshots
bind = , Print, exec, grim -g "$(slurp)" - | wl-copy
bind = SHIFT, Print, exec, grim - | wl-copy
bind = CTRL, Print, exec, grim -g "$(slurp)" ~/Pictures/screenshot-$(date +%Y%m%d-%H%M%S).png

# Volume control
binde = , XF86AudioRaiseVolume, exec, pamixer -i 5
binde = , XF86AudioLowerVolume, exec, pamixer -d 5
bind = , XF86AudioMute, exec, pamixer -t

# Media control
bind = , XF86AudioPlay, exec, playerctl play-pause
bind = , XF86AudioNext, exec, playerctl next
bind = , XF86AudioPrev, exec, playerctl previous

# Brightness control (for laptops)
binde = , XF86MonBrightnessUp, exec, brightnessctl set +10%
binde = , XF86MonBrightnessDown, exec, brightnessctl set 10%-

# Move/resize windows with mouse
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

# Scroll through workspaces
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1

# Toggle waybar
bind = $mainMod SHIFT, SPACE, exec, killall -SIGUSR1 waybar
~/.config/waybar/config
Waybar status bar configuration (JSON)
{
    "layer": "top",
    "position": "top",
    "height": 40,
    "spacing": 4,
    "exclusive": true,
    "gtk-layer-shell": true,
    
    "modules-left": ["hyprland/workspaces", "hyprland/window"],
    "modules-center": ["clock"],
    "modules-right": ["cpu", "memory", "network", "pulseaudio", "battery", "tray"],
    
    "hyprland/workspaces": {
        "format": "{id}",
        "on-click": "activate",
        "active-only": false,
        "all-outputs": false,
        "format-icons": {
            "urgent": "",
            "active": "",
            "default": ""
        },
        "persistent-workspaces": {
            "*": 10
        }
    },
    
    "hyprland/window": {
        "format": "{}",
        "separate-outputs": true,
        "max-length": 50
    },
    
    "clock": {
        "interval": 1,
        "format": "{:%a %d %b  %I:%M %p}",
        "format-alt": "{:%Y-%m-%d  %H:%M:%S}",
        "tooltip-format": "{:%Y %B}\n{calendar}",
        "calendar": {
            "mode": "year",
            "mode-mon-col": 3,
            "weeks-pos": "right",
            "on-scroll": 1,
            "on-click-right": "mode",
            "format": {
                "months": "{}",
                "days": "{}",
                "weeks": "W{}",
                "weekdays": "{}",
                "today": "{}"
            }
        }
    },
    
    "cpu": {
        "interval": 2,
        "format": " {usage}%",
        "format-alt": " {avg_frequency}GHz",
        "tooltip": true,
        "on-click": "foot -e btop"
    },
    
    "memory": {
        "interval": 2,
        "format": " {percentage}%",
        "format-alt": " {used:0.1f}G/{total:0.1f}G",
        "tooltip": true,
        "tooltip-format": "Memory: {used:0.1f}G/{total:0.1f}G\nSwap: {swapUsed:0.1f}G/{swapTotal:0.1f}G"
    },
    
    "network": {
        "interval": 2,
        "format-wifi": " {signalStrength}%",
        "format-ethernet": "σ°ˆ€ {ifname}",
        "format-linked": " {ifname} (No IP)",
        "format-disconnected": "⚠ Disconnected",
        "format-alt": "{ifname}: {ipaddr}/{cidr}",
        "tooltip-format": "{ifname}\n{ipaddr}/{cidr}\n↑ {bandwidthUpBits} ↓ {bandwidthDownBits}",
        "on-click-right": "foot -e nmtui"
    },
    
    "pulseaudio": {
        "scroll-step": 5,
        "format": "{icon} {volume}%",
        "format-bluetooth": "{icon} {volume}%",
        "format-bluetooth-muted": "󰝟 {icon}",
        "format-muted": "󰝟",
        "format-icons": {
            "headphone": "",
            "hands-free": "",
            "headset": "",
            "phone": "",
            "portable": "",
            "car": "",
            "default": ["", "", ""]
        },
        "on-click": "pavucontrol",
        "on-click-right": "pamixer -t",
        "on-click-middle": "playerctl play-pause"
    },
    
    "battery": {
        "interval": 30,
        "states": {
            "warning": 30,
            "critical": 15
        },
        "format": "{icon} {capacity}%",
        "format-charging": "σ°‚„ {capacity}%",
        "format-plugged": " {capacity}%",
        "format-alt": "{icon} {time}",
        "format-icons": ["", "", "", "", ""],
        "tooltip-format": "{timeTo}\n{power}W"
    },
    
    "tray": {
        "icon-size": 18,
        "spacing": 10,
        "show-passive-items": true
    }
}
~/.config/waybar/style.css
Waybar styling (Sonokai theme)
/* Waybar Sonokai Theme */

* {
    font-family: "JetBrainsMono Nerd Font", "Font Awesome 6 Free";
    font-size: 13px;
    min-height: 0;
}

window#waybar {
    background-color: rgba(44, 46, 52, 0.95);  /* #2c2e34 */
    color: #e1e3e4;
    transition-property: background-color;
    transition-duration: .5s;
}

window#waybar.hidden {
    opacity: 0.2;
}

/* Workspaces */
#workspaces {
    margin: 0 8px;
}

#workspaces button {
    padding: 0 8px;
    margin: 4px 2px;
    background-color: rgba(65, 69, 80, 0.8);  /* #414550 */
    color: #e1e3e4;
    border-radius: 6px;
    border: 2px solid transparent;
    transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.68);
}

#workspaces button:hover {
    background-color: rgba(65, 69, 80, 1);
    border-color: #76cce0;
    color: #76cce0;
}

#workspaces button.active {
    background-color: rgba(54, 57, 68, 1);  /* #363944 */
    color: #fc5d7c;
    border-color: #fc5d7c;
}

#workspaces button.urgent {
    background-color: #f39660;
    color: #2c2e34;
    animation: blink 0.5s linear infinite alternate;
}

/* Window title */
#window {
    margin: 0 8px;
    color: #b39df3;
}

/* Common module styling */
#clock,
#battery,
#cpu,
#memory,
#network,
#pulseaudio,
#tray {
    padding: 0 12px;
    margin: 4px 3px;
    background-color: rgba(54, 57, 68, 0.9);  /* #363944 */
    border-radius: 8px;
}

/* Clock */
#clock {
    color: #e7c664;
    font-weight: bold;
    background-color: rgba(54, 57, 68, 0.9);
}

/* CPU */
#cpu {
    color: #76cce0;
}

#cpu.warning {
    color: #e7c664;
    background-color: rgba(231, 198, 100, 0.2);
}

#cpu.critical {
    color: #fc5d7c;
    background-color: rgba(252, 93, 124, 0.2);
    animation: blink 0.5s linear infinite alternate;
}

/* Memory */
#memory {
    color: #b39df3;
}

#memory.warning {
    color: #e7c664;
    background-color: rgba(231, 198, 100, 0.2);
}

#memory.critical {
    color: #fc5d7c;
    background-color: rgba(252, 93, 124, 0.2);
}

/* Network */
#network {
    color: #9ed072;
}

#network.disconnected {
    color: #fc5d7c;
    background-color: rgba(252, 93, 124, 0.2);
}

#network.wifi {
    color: #9ed072;
}

#network.ethernet {
    color: #76cce0;
}

/* Audio */
#pulseaudio {
    color: #f39660;
}

#pulseaudio.muted {
    color: #7f8490;
    background-color: rgba(127, 132, 144, 0.2);
}

/* Battery */
#battery {
    color: #9ed072;
}

#battery.charging,
#battery.plugged {
    color: #76cce0;
    background-color: rgba(118, 204, 224, 0.2);
}

#battery.warning:not(.charging) {
    color: #e7c664;
    background-color: rgba(231, 198, 100, 0.2);
}

#battery.critical:not(.charging) {
    color: #fc5d7c;
    background-color: rgba(252, 93, 124, 0.2);
    animation: blink 0.5s linear infinite alternate;
}

/* Tray */
#tray {
    background-color: rgba(54, 57, 68, 0.9);
}

#tray > .passive {
    -gtk-icon-effect: dim;
}

#tray > .needs-attention {
    -gtk-icon-effect: highlight;
}

/* Animations */
@keyframes blink {
    to {
        background-color: rgba(252, 93, 124, 0.5);
        color: #2c2e34;
    }
}

/* Tooltip styling */
tooltip {
    background-color: rgba(44, 46, 52, 0.98);
    border: 2px solid #76cce0;
    border-radius: 8px;
    padding: 8px;
}

tooltip label {
    color: #e1e3e4;
    padding: 5px;
}

/* Custom module background on hover */
#clock:hover,
#battery:hover,
#cpu:hover,
#memory:hover,
#network:hover,
#pulseaudio:hover {
    background-color: rgba(65, 69, 80, 0.9);
    border: 1px solid #76cce0;
}
~/.config/foot/foot.ini
Foot terminal configuration
# Foot Terminal Configuration
# Sonokai theme matching kitty config

[main]
font=JetBrainsMono Nerd Font:size=11
font-bold=JetBrainsMono Nerd Font:style=Bold:size=11
font-italic=JetBrainsMono Nerd Font:style=Italic:size=11
font-bold-italic=JetBrainsMono Nerd Font:style=Bold Italic:size=11
dpi-aware=yes
pad=8x8
initial-window-size-chars=120x30
initial-window-mode=windowed

[bell]
urgent=no
notify=no
command=
command-focused=no

[scrollback]
lines=10000
multiplier=3.0

[url]
launch=xdg-open ${url}
protocols=http, https, ftp, ftps, file, gemini, gopher
uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]

[cursor]
style=beam
blink=no
beam-thickness=1.5

[mouse]
hide-when-typing=yes
alternate-scroll-mode=yes

# Sonokai Color Scheme
[colors]
alpha=0.95
background=2c2e34
foreground=e1e3e4

# Normal colors
regular0=181a1c  # black
regular1=fc5d7c  # red (originally ff6578)
regular2=9ed072  # green (originally 9dd274)
regular3=e7c664  # yellow (originally eacb64)
regular4=76cce0  # blue (originally 72cce8)
regular5=b39df3  # magenta (originally ba9cf3)
regular6=f39660  # cyan/orange (originally f69c5e)
regular7=e1e3e4  # white

# Bright colors
bright0=7f8490   # bright black (grey)
bright1=fc5d7c   # bright red
bright2=9ed072   # bright green
bright3=e7c664   # bright yellow
bright4=76cce0   # bright blue
bright5=b39df3   # bright magenta
bright6=f39660   # bright cyan/orange
bright7=e1e3e4   # bright white

# Selection colors
selection-background=3d4455
selection-foreground=e1e3e4

# Jump label colors
jump-labels=1e1e1e e7c664
urls=76cce0

[csd]
preferred=server
size=26
font=JetBrainsMono Nerd Font:size=10
color=2c2e34 e1e3e4
hide-when-maximized=no
double-click-to-maximize=yes
button-width=26
button-color=7f8490 e1e3e4
button-hover-color=e1e3e4 2c2e34
button-minimize-color=e7c664 1e1e1e
button-maximize-color=9ed072 1e1e1e  
button-close-color=fc5d7c e1e3e4

[key-bindings]
# Clipboard
clipboard-copy=Control+Shift+c Control+Insert
clipboard-paste=Control+Shift+v Shift+Insert

# Scrollback
scrollback-up-page=Shift+Page_Up
scrollback-up-half-page=Control+Shift+u
scrollback-up-line=Control+Shift+k
scrollback-down-page=Shift+Page_Down  
scrollback-down-half-page=Control+Shift+d
scrollback-down-line=Control+Shift+j
scrollback-home=Control+Shift+Home
scrollback-end=Control+Shift+End

# Search
search-start=Control+Shift+f
search-up=Control+Shift+n
search-down=Control+Shift+p

# Font size
font-increase=Control+plus Control+equal Control+KP_Add
font-decrease=Control+minus Control+KP_Subtract
font-reset=Control+0 Control+KP_0

# Terminal
spawn-terminal=Control+Shift+Return
fullscreen=F11
reset=Control+Shift+r

# URLs
show-urls-launch=Control+Shift+u
show-urls-copy=Control+Shift+y

[search-bindings]
find-prev=Control+Shift+n
find-next=Control+Shift+p
cancel=Control+g Control+c Escape

[url-bindings]
cancel=Control+g Control+c Control+d Escape

[text-bindings]
# vim-like bindings in scrollback
\x1b[1;5D=\x1b[H        # Control+Left -> Home
\x1b[1;5C=\x1b[F        # Control+Right -> End

[mouse-bindings]
# Right click to paste
primary-paste=BTN_MIDDLE
select-extend=Control+BTN_LEFT
select-extend-character-wise=Control+Shift+BTN_LEFT
select-word=BTN_LEFT-2
select-row=BTN_LEFT-3
~/.config/fish/config.fish
Fish shell user configuration
# Fish Shell Configuration
# Personal settings and overrides

# Only add user-specific settings here
# System-wide settings are in /etc/nixos/modules/shell.nix

# Additional aliases (personal preferences)
alias vim="hx"  # Use helix instead of vim
alias gss="git status -s"
alias gcm="git commit -m"
alias gca="git commit --amend"
alias gco="git checkout"
alias gb="git branch"
alias gba="git branch -a"
alias gbd="git branch -d"
alias gf="git fetch"
alias gr="git rebase"
alias gri="git rebase -i"
alias grc="git rebase --continue"
alias gra="git rebase --abort"

# Custom functions

# Quick project navigation
function proj
    cd ~/projects/$argv
    and ls
end

# Create directory and cd into it
function mkcd
    mkdir -p $argv
    and cd $argv
end

# Quick system update
function sysup
    echo "Updating system..."
    sudo nix-channel --update
    and sudo nixos-rebuild switch --upgrade
    and echo "System updated successfully!"
end

# Clean system
function sysclean
    echo "Cleaning system..."
    sudo nix-collect-garbage -d
    and sudo nix-store --optimize
    and echo "System cleaned!"
end

# Git push with upstream
function gpu
    git push -u origin (git branch --show-current)
end

# Weather
function weather
    curl "wttr.in/$argv"
end

# Personal environment variables
set -gx PROJECTS "$HOME/projects"
set -gx SCRIPTS "$HOME/scripts"
set -gx NOTES "$HOME/notes"

# Path additions (if needed)
# fish_add_path $HOME/.local/bin
# fish_add_path $HOME/scripts

# Load any local/private configurations
if test -f ~/.config/fish/local.fish
    source ~/.config/fish/local.fish
end

# Greeting (optional - uncomment if you want a custom greeting)
# function fish_greeting
#     echo "Welcome back, $USER!"
#     echo "Today is" (date +"%A, %B %d, %Y")
# end

Phase 2: Enhanced Configuration

πŸ“‹ These configurations add more advanced features and customizations
~/.config/hypr/scripts/autostart.sh
Autostart script for additional services
#!/usr/bin/env bash
# Hyprland autostart script

# Wait for Hyprland to fully start
sleep 2

# Set wallpaper
swww img ~/Pictures/Wallpapers/wallpaper.jpg --transition-type fade &

# Start clipboard manager
wl-paste --type text --watch cliphist store &
wl-paste --type image --watch cliphist store &

# Start idle manager
swayidle -w \
    timeout 300 'swaylock -f' \
    timeout 600 'hyprctl dispatch dpms off' \
    resume 'hyprctl dispatch dpms on' \
    before-sleep 'swaylock -f' &

# Start notification daemon if not running
pgrep -x dunst > /dev/null || dunst &

# Start authentication agent
/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &

# Network manager applet
nm-applet --indicator &

# Auto-mount USB drives
udiskie &

# Night light (blue light filter)
# wlsunset -l 40.7 -L -74.0 &  # Set your latitude/longitude
~/.config/waybar/scripts/workspace-icons.sh
Script to show app icons in workspaces
#!/usr/bin/env bash
# Get app icons for each workspace

get_icon() {
    case "$1" in
        "firefox") echo "" ;;
        "foot") echo "" ;;
        "kitty") echo "" ;;
        "code") echo "󰨞" ;;
        "discord") echo "σ°™―" ;;
        "slack") echo "σ°’±" ;;
        "spotify") echo "" ;;
        "vlc") echo "σ°•Ό" ;;
        "mpv") echo "" ;;
        "thunar") echo "" ;;
        "nautilus") echo "" ;;
        "libreoffice") echo "" ;;
        "gimp") echo "" ;;
        "inkscape") echo "" ;;
        *) echo "" ;;
    esac
}

# Get windows for workspace
workspace=$1
windows=$(hyprctl clients -j | jq -r ".[] | select(.workspace.id == $workspace) | .class" | tr '[:upper:]' '[:lower:]')

icons=""
for window in $windows; do
    icon=$(get_icon "$window")
    if [ -n "$icon" ]; then
        icons="$icons $icon"
    fi
done

echo "$icons"
~/.config/swaylock/config
Swaylock configuration for screen locking
# Swaylock configuration
# Sonokai themed lock screen

# Colors
color=2c2e34ff
bs-hl-color=fc5d7cff
key-hl-color=76cce0ff
ring-color=363944ff
ring-clear-color=9ed072ff
ring-ver-color=76cce0ff
ring-wrong-color=fc5d7cff
separator-color=00000000
text-color=e1e3e4ff
text-clear-color=e1e3e4ff
text-ver-color=e1e3e4ff
text-wrong-color=e1e3e4ff

# Ring
line-color=00000000
line-clear-color=00000000
line-ver-color=00000000
line-wrong-color=00000000
inside-color=2c2e3488
inside-clear-color=9ed07288
inside-ver-color=76cce088
inside-wrong-color=fc5d7c88
ring-clear-color=9ed072ff
ring-ver-color=76cce0ff
ring-wrong-color=fc5d7cff

# Text
font=JetBrainsMono Nerd Font
font-size=24
text-clear=Unlocked!
text-ver=Verifying...
text-wrong=Wrong!

# Other
indicator-radius=100
indicator-thickness=20
show-failed-attempts
ignore-empty-password
hide-keyboard-layout

# Effects
clock
timestr=%I:%M %p
datestr=%A, %B %d
effect-blur=7x5
effect-vignette=0.5:0.5
fade-in=0.3

# Image (optional - comment out for solid color)
# image=~/Pictures/Wallpapers/lockscreen.jpg
# scaling=fill
~/.config/dunst/dunstrc
Notification daemon configuration
# Dunst configuration (Sonokai theme)

[global]
    # Display
    monitor = 0
    follow = mouse
    width = 350
    height = 200
    origin = top-right
    offset = 10x50
    scale = 0
    notification_limit = 0

    # Progress bar
    progress_bar = true
    progress_bar_height = 10
    progress_bar_frame_width = 1
    progress_bar_min_width = 150
    progress_bar_max_width = 300

    # Appearance
    transparency = 10
    separator_height = 2
    padding = 10
    horizontal_padding = 10
    text_icon_padding = 0
    frame_width = 2
    frame_color = "#76cce0"
    separator_color = frame
    sort = yes
    idle_threshold = 120

    # Text
    font = JetBrainsMono Nerd Font 10
    line_height = 0
    markup = full
    format = "%s\n%b"
    alignment = left
    vertical_alignment = center
    show_age_threshold = 60
    ellipsize = middle
    ignore_newline = no
    stack_duplicates = true
    hide_duplicate_count = false
    show_indicators = yes

    # Icons
    icon_position = left
    min_icon_size = 0
    max_icon_size = 64
    icon_path = /usr/share/icons/Papirus-Dark/16x16/status/:/usr/share/icons/Papirus-Dark/16x16/devices/

    # History
    sticky_history = yes
    history_length = 20

    # Misc
    browser = /usr/bin/firefox
    always_run_script = true
    title = Dunst
    class = Dunst
    corner_radius = 8
    ignore_dbusclose = false

    # Mouse
    mouse_left_click = close_current
    mouse_middle_click = do_action, close_current
    mouse_right_click = close_all

[urgency_low]
    background = "#2c2e34"
    foreground = "#e1e3e4"
    frame_color = "#363944"
    timeout = 5

[urgency_normal]
    background = "#363944"
    foreground = "#e1e3e4"
    frame_color = "#76cce0"
    timeout = 10

[urgency_critical]
    background = "#fc5d7c"
    foreground = "#2c2e34"
    frame_color = "#fc5d7c"
    timeout = 0

# App-specific rules
[spotify]
    appname = Spotify
    format = "Now Playing\n%s\n%b"
    background = "#363944"
    foreground = "#9ed072"
    frame_color = "#9ed072"

[discord]
    appname = discord
    format = "%s\n%b"
    background = "#363944"
    foreground = "#b39df3"
    frame_color = "#b39df3"
~/.config/rofi/config.rasi
Rofi launcher configuration with Sonokai theme
/* Rofi Configuration - Sonokai Theme */

configuration {
    modi: "drun,run,window,ssh";
    font: "JetBrainsMono Nerd Font 12";
    show-icons: true;
    icon-theme: "Papirus-Dark";
    display-drun: " Apps";
    display-run: " Run";
    display-window: " Windows";
    display-ssh: " SSH";
    drun-display-format: "{name}";
    sidebar-mode: true;
    hover-select: true;
    me-select-entry: "";
    me-accept-entry: "MousePrimary";
}

* {
    /* Sonokai colors */
    bg0:     #2c2e34;
    bg1:     #363944;
    bg2:     #414550;
    fg:      #e1e3e4;
    red:     #fc5d7c;
    green:   #9ed072;
    yellow:  #e7c664;
    blue:    #76cce0;
    magenta: #b39df3;
    cyan:    #f39660;
    
    background-color: transparent;
    text-color: @fg;
}

window {
    transparency: "real";
    background-color: @bg0;
    border: 2px;
    border-color: @blue;
    border-radius: 8px;
    width: 750px;
    padding: 20px;
}

mainbox {
    background-color: transparent;
    children: [inputbar, message, listview, mode-switcher];
    spacing: 20px;
}

inputbar {
    background-color: @bg1;
    border-radius: 8px;
    padding: 10px;
    children: [prompt, entry];
}

prompt {
    background-color: transparent;
    text-color: @blue;
    padding: 0px 10px 0px 0px;
}

entry {
    background-color: transparent;
    text-color: @fg;
    placeholder: "Search...";
    placeholder-color: @bg2;
}

listview {
    background-color: transparent;
    columns: 2;
    lines: 8;
    spacing: 10px;
    cycle: true;
    dynamic: true;
    layout: vertical;
}

element {
    background-color: @bg1;
    border-radius: 8px;
    padding: 10px;
    spacing: 10px;
    orientation: horizontal;
}

element-icon {
    size: 32px;
    background-color: transparent;
}

element-text {
    background-color: transparent;
    text-color: @fg;
    vertical-align: 0.5;
}

element.selected {
    background-color: @bg2;
    border: 2px;
    border-color: @blue;
}

element.selected.active {
    background-color: @blue;
    text-color: @bg0;
}

element.alternate {
    background-color: @bg1;
}

mode-switcher {
    background-color: @bg1;
    border-radius: 8px;
    padding: 5px;
}

button {
    background-color: transparent;
    text-color: @fg;
    padding: 5px 10px;
    border-radius: 4px;
}

button.selected {
    background-color: @blue;
    text-color: @bg0;
}

message {
    background-color: @bg1;
    border-radius: 8px;
    padding: 10px;
}

textbox {
    background-color: transparent;
    text-color: @fg;
}
~/.config/starship.toml
Enhanced Starship prompt configuration
# Starship prompt configuration

# Get editor completions based on the config schema
"$schema" = 'https://starship.rs/config-schema.json'

# Format
format = """
[](#9ed072)\
$os\
$username\
[](bg:#76cce0 fg:#9ed072)\
$directory\
[](fg:#76cce0 bg:#b39df3)\
$git_branch\
$git_status\
[](fg:#b39df3 bg:#e7c664)\
$c\
$elixir\
$elm\
$golang\
$haskell\
$java\
$julia\
$nodejs\
$nim\
$python\
$rust\
[](fg:#e7c664 bg:#fc5d7c)\
$docker_context\
[](fg:#fc5d7c bg:#363944)\
$time\
[ ](fg:#363944)\
\n$character
"""

# Right format
right_format = """
$cmd_duration\
$status\
"""

# Modules configuration
[username]
show_always = true
style_user = "bg:#9ed072 fg:#2c2e34"
style_root = "bg:#9ed072 fg:#2c2e34"
format = '[ $user ]($style)'
disabled = false

[os]
style = "bg:#9ed072 fg:#2c2e34"
disabled = false

[os.symbols]
Alpine = " "
Amazon = " "
Android = " "
Arch = " "
CentOS = " "
Debian = " "
Fedora = " "
FreeBSD = " "
Gentoo = " "
Linux = " "
Macos = " "
Manjaro = " "
Mint = " "
NixOS = " "
OpenBSD = " "
openSUSE = " "
Pop = " "
Raspbian = " "
RedHat = " "
SUSE = " "
Ubuntu = " "
Unknown = " "
Windows = " "

[directory]
style = "bg:#76cce0 fg:#2c2e34"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"
read_only = " 󰌾"

[directory.substitutions]
"Documents" = "σ°ˆ™ "
"Downloads" = " "
"Music" = " "
"Pictures" = " "

[git_branch]
symbol = ""
style = "bg:#b39df3 fg:#2c2e34"
format = '[ $symbol $branch ]($style)'

[git_status]
style = "bg:#b39df3 fg:#2c2e34"
format = '[$all_status$ahead_behind ]($style)'

[nodejs]
symbol = ""
style = "bg:#e7c664 fg:#2c2e34"
format = '[ $symbol ($version) ]($style)'

[rust]
symbol = ""
style = "bg:#e7c664 fg:#2c2e34"
format = '[ $symbol ($version) ]($style)'

[golang]
symbol = ""
style = "bg:#e7c664 fg:#2c2e34"
format = '[ $symbol ($version) ]($style)'

[python]
symbol = ""
style = "bg:#e7c664 fg:#2c2e34"
format = '[ $symbol ($version) ]($style)'

[docker_context]
symbol = ""
style = "bg:#fc5d7c fg:#2c2e34"
format = '[ $symbol $context ]($style)'

[time]
disabled = false
time_format = "%R"
style = "bg:#363944 fg:#e1e3e4"
format = '[ $time ]($style)'

[character]
success_symbol = '[➜](bold fg:#9ed072)'
error_symbol = '[➜](bold fg:#fc5d7c)'
vicmd_symbol = '[V](bold fg:#9ed072)'

[cmd_duration]
min_time = 500
format = '[ $duration](bold fg:#e7c664)'

[status]
style = "fg:#fc5d7c"
symbol = "βœ–"
format = '[$symbol $status]($style) '
disabled = false

Phase 3: Advanced Customization

πŸš€ These configurations add the final touches to match your macOS workflow
~/.config/waybar/modules/menu-toggle.sh
Script to toggle between workspace and menu view
~/.config/yazi/yazi.toml
Yazi file manager configuration
# Yazi configuration

[manager]
# Layout
ratio = [1, 4, 3]
sort_by = "natural"
sort_sensitive = false
sort_reverse = false
sort_dir_first = true
linemode = "size"
show_hidden = true
show_symlink = true

# Scrolling
scrolloff = 5

[preview]
# File preview
tab_size = 2
max_width = 600
max_height = 900
cache_dir = "~/.cache/yazi"

# Image preview
image_filter = "lanczos3"
image_quality = 75

[opener]
# Default applications
text = [
    { exec = 'hx "$@"', desc = "Helix" },
    { exec = 'nvim "$@"', desc = "Neovim" },
    { exec = 'kate "$@"', desc = "Kate" },
]

image = [
    { exec = 'imv "$@"', desc = "imv" },
    { exec = 'feh "$@"', desc = "feh" },
]

video = [
    { exec = 'mpv "$@"', desc = "MPV" },
    { exec = 'vlc "$@"', desc = "VLC" },
]

audio = [
    { exec = 'mpv "$@"', desc = "MPV" },
    { exec = 'vlc "$@"', desc = "VLC" },
]

pdf = [
    { exec = 'zathura "$@"', desc = "Zathura" },
    { exec = 'firefox "$@"', desc = "Firefox" },
]

# Fallback
fallback = [
    { exec = 'xdg-open "$@"', desc = "Default" },
]

[tasks]
micro_workers = 5
macro_workers = 10
bizarre_retry = 5

[log]
enabled = false
~/.config/yazi/keymap.toml
Yazi keybindings matching nnn/vim style
# Yazi keymap configuration

[manager]

# Navigation (vim-style)
keymap = [
    { on = ["j"], exec = "arrow -1", desc = "Move cursor up" },
    { on = ["k"], exec = "arrow 1", desc = "Move cursor down" },
    { on = ["h"], exec = "leave", desc = "Go to parent directory" },
    { on = ["l"], exec = "enter", desc = "Enter directory or open file" },
    
    # Fast navigation
    { on = ["g", "g"], exec = "arrow -99999999", desc = "Go to top" },
    { on = ["G"], exec = "arrow 99999999", desc = "Go to bottom" },
    { on = [""], exec = "arrow -50%", desc = "Move up half page" },
    { on = [""], exec = "arrow 50%", desc = "Move down half page" },
    
    # Searching
    { on = ["/"], exec = "find", desc = "Find" },
    { on = ["n"], exec = "find_arrow", desc = "Next match" },
    { on = ["N"], exec = "find_arrow -previous", desc = "Previous match" },
    
    # Selection
    { on = [""], exec = "select --state=none", desc = "Toggle selection" },
    { on = ["v"], exec = "visual_mode", desc = "Enter visual mode" },
    { on = ["V"], exec = "visual_mode --unset", desc = "Exit visual mode" },
    { on = [""], exec = "select_all --state=true", desc = "Select all" },
    { on = [""], exec = "select_all --state=none", desc = "Deselect all" },
    
    # Operations
    { on = ["o"], exec = "open", desc = "Open" },
    { on = ["O"], exec = "open --interactive", desc = "Open interactively" },
    { on = [""], exec = "open", desc = "Open" },
    { on = ["y"], exec = "yank", desc = "Yank/copy" },
    { on = ["x"], exec = "yank --cut", desc = "Cut" },
    { on = ["p"], exec = "paste", desc = "Paste" },
    { on = ["P"], exec = "paste --force", desc = "Paste (overwrite)" },
    { on = ["d"], exec = "remove", desc = "Delete" },
    { on = ["D"], exec = "remove --permanently", desc = "Delete permanently" },
    
    # Create
    { on = ["a"], exec = "create", desc = "Create file/directory" },
    { on = ["r"], exec = "rename", desc = "Rename" },
    
    # Tabs
    { on = ["t"], exec = "tab_create --current", desc = "New tab" },
    { on = ["1"], exec = "tab_switch 0", desc = "Switch to tab 1" },
    { on = ["2"], exec = "tab_switch 1", desc = "Switch to tab 2" },
    { on = ["3"], exec = "tab_switch 2", desc = "Switch to tab 3" },
    { on = ["4"], exec = "tab_switch 3", desc = "Switch to tab 4" },
    { on = ["5"], exec = "tab_switch 4", desc = "Switch to tab 5" },
    
    # Misc
    { on = ["."], exec = "hidden toggle", desc = "Toggle hidden files" },
    { on = ["s"], exec = "sort", desc = "Sort" },
    { on = ["?"], exec = "help", desc = "Help" },
    { on = ["q"], exec = "quit", desc = "Quit" },
    { on = ["Q"], exec = "quit --no-cwd-file", desc = "Quit without writing cwd" },
    { on = [""], exec = "close", desc = "Cancel" },
    { on = ["z", "h"], exec = "hidden toggle", desc = "Toggle hidden" },
    { on = ["z", "i"], exec = "linemode size", desc = "Show size" },
    { on = ["z", "m"], exec = "linemode mtime", desc = "Show mtime" },
    { on = ["z", "p"], exec = "linemode permissions", desc = "Show permissions" },
]

[tasks]
keymap = [
    { on = ["j"], exec = "arrow -1", desc = "Move up" },
    { on = ["k"], exec = "arrow 1", desc = "Move down" },
    { on = [""], exec = "inspect", desc = "Inspect" },
    { on = ["x"], exec = "cancel", desc = "Cancel" },
    { on = ["~"], exec = "help", desc = "Help" },
    { on = [""], exec = "close", desc = "Close" },
]

[select]
keymap = [
    { on = ["j"], exec = "arrow -1", desc = "Move up" },
    { on = ["k"], exec = "arrow 1", desc = "Move down" },
    { on = [""], exec = "run", desc = "Run" },
    { on = [""], exec = "close", desc = "Cancel" },
]

[input]
keymap = [
    { on = [""], exec = "close", desc = "Cancel" },
    { on = [""], exec = "close --submit", desc = "Submit" },
    { on = [""], exec = "escape", desc = "Escape" },
]
~/.config/yazi/theme.toml
Yazi Sonokai theme
# Yazi Sonokai Theme

[manager]
# Syntax highlighting
cwd = { fg = "#e7c664" }

# Hovered
hovered = { reversed = true }
preview_hovered = { underline = true }

# Find
find_keyword = { fg = "#e7c664", bold = true, italic = true, underline = true }
find_position = { fg = "#b39df3", bg = "reset", bold = true, italic = true }

# Marker
marker_copied = { fg = "#9ed072", bg = "#9ed072" }
marker_cut = { fg = "#fc5d7c", bg = "#fc5d7c" }
marker_selected = { fg = "#76cce0", bg = "#76cce0" }

# Tab
tab_active = { fg = "#2c2e34", bg = "#76cce0" }
tab_inactive = { fg = "#e1e3e4", bg = "#363944" }
tab_width = 1

# Count
count_copied = { fg = "#2c2e34", bg = "#9ed072" }
count_cut = { fg = "#2c2e34", bg = "#fc5d7c" }
count_selected = { fg = "#2c2e34", bg = "#76cce0" }

# Border
border_symbol = "β”‚"
border_style = { fg = "#414550" }

# Highlighting
syntect_theme = "~/.config/yazi/Sonokai.tmTheme"

[status]
separator_open = ""
separator_close = ""
separator_style = { fg = "#363944", bg = "#363944" }

# Mode
mode_normal = { fg = "#2c2e34", bg = "#76cce0", bold = true }
mode_select = { fg = "#2c2e34", bg = "#9ed072", bold = true }
mode_unset = { fg = "#2c2e34", bg = "#fc5d7c", bold = true }

# Progress
progress_label = { fg = "#e1e3e4", bold = true }
progress_normal = { fg = "#76cce0", bg = "#363944" }
progress_error = { fg = "#fc5d7c", bg = "#363944" }

# Permissions
permissions_t = { fg = "#76cce0" }
permissions_r = { fg = "#e7c664" }
permissions_w = { fg = "#fc5d7c" }
permissions_x = { fg = "#9ed072" }
permissions_s = { fg = "#414550" }

[input]
border = { fg = "#76cce0" }
title = {}
value = {}
selected = { reversed = true }

[select]
border = { fg = "#76cce0" }
active = { fg = "#b39df3", bold = true }
inactive = {}

[tasks]
border = { fg = "#76cce0" }
title = {}
hovered = { fg = "#b39df3", underline = true }

[which]
cols = 3
mask = { bg = "#2c2e34" }
cand = { fg = "#76cce0" }
rest = { fg = "#7f8490" }
desc = { fg = "#b39df3" }
separator = "  "
separator_style = { fg = "#363944" }

[filetype]
rules = [
    # Images
    { name = "*.jpg", fg = "#b39df3" },
    { name = "*.jpeg", fg = "#b39df3" },
    { name = "*.png", fg = "#b39df3" },
    { name = "*.gif", fg = "#b39df3" },
    { name = "*.webp", fg = "#b39df3" },
    { name = "*.svg", fg = "#b39df3" },
    
    # Videos
    { name = "*.mp4", fg = "#fc5d7c" },
    { name = "*.mkv", fg = "#fc5d7c" },
    { name = "*.avi", fg = "#fc5d7c" },
    { name = "*.mov", fg = "#fc5d7c" },
    
    # Audio
    { name = "*.mp3", fg = "#f39660" },
    { name = "*.flac", fg = "#f39660" },
    { name = "*.wav", fg = "#f39660" },
    { name = "*.ogg", fg = "#f39660" },
    
    # Archives
    { name = "*.zip", fg = "#e7c664" },
    { name = "*.tar", fg = "#e7c664" },
    { name = "*.gz", fg = "#e7c664" },
    { name = "*.7z", fg = "#e7c664" },
    { name = "*.rar", fg = "#e7c664" },
    
    # Documents
    { name = "*.pdf", fg = "#fc5d7c" },
    { name = "*.doc", fg = "#76cce0" },
    { name = "*.docx", fg = "#76cce0" },
    
    # Code
    { name = "*.sh", fg = "#9ed072" },
    { name = "*.py", fg = "#76cce0" },
    { name = "*.js", fg = "#e7c664" },
    { name = "*.rs", fg = "#f39660" },
    { name = "*.go", fg = "#76cce0" },
    { name = "*.cpp", fg = "#fc5d7c" },
    { name = "*.c", fg = "#fc5d7c" },
    { name = "*.h", fg = "#fc5d7c" },
    { name = "*.nix", fg = "#76cce0" },
    
    # Configs
    { name = "*.toml", fg = "#9ed072" },
    { name = "*.yaml", fg = "#9ed072" },
    { name = "*.yml", fg = "#9ed072" },
    { name = "*.json", fg = "#9ed072" },
    { name = "*.conf", fg = "#9ed072" },
    
    # Special
    { name = "*", is = "directory", fg = "#76cce0", bold = true },
    { name = "*", is = "link", fg = "#b39df3", underline = true },
]
~/.config/helix/languages.toml
Helix language server configuration
# Helix languages configuration

[[language]]
name = "nix"
scope = "source.nix"
injection-regex = "nix"
file-types = ["nix"]
comment-token = "#"
language-server = { command = "nil" }
indent = { tab-width = 2, unit = "  " }
auto-format = true
formatter = { command = "nixpkgs-fmt" }

[[language]]
name = "rust"
auto-format = true
formatter = { command = "rustfmt" }

[[language]]
name = "python"
language-server = { command = "pylsp" }
auto-format = true
formatter = { command = "black", args = ["-", "-q"] }

[[language]]
name = "typescript"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "typescript"] }

[[language]]
name = "javascript"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "javascript"] }

[[language]]
name = "json"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "json"] }

[[language]]
name = "html"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "html"] }

[[language]]
name = "css"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "css"] }

[[language]]
name = "markdown"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "markdown"] }

[[language]]
name = "yaml"
auto-format = true
formatter = { command = "prettier", args = ["--parser", "yaml"] }

[[language]]
name = "toml"
auto-format = true
formatter = { command = "taplo", args = ["fmt", "-"] }

[[language]]
name = "fish"
scope = "source.fish"
injection-regex = "fish"
file-types = ["fish"]
comment-token = "#"
indent = { tab-width = 4, unit = "    " }
language-server = { command = "fish-lsp" }
~/.config/btop/btop.conf
Btop++ system monitor configuration
# Btop configuration file

# Color theme
color_theme = "Default"

# Update time in milliseconds
update_ms = 1000

# Processes sorting
proc_sorting = "cpu lazy"

# Reverse sorting order
proc_reversed = False

# Show processes as tree
proc_tree = True

# Use colors in process list
proc_colors = True

# Process gradients
proc_gradient = True

# Process command line
proc_per_core = False

# Process memory as graphs
proc_mem_bytes = True

# CPU graph settings
cpu_graph_upper = "total"
cpu_graph_lower = "total"

# CPU core load graph
cpu_invert_lower = True
cpu_single_graph = False

# Show CPU frequency
show_cpu_freq = True

# Show CPU temperature
check_temp = True
cpu_sensor = "Auto"
show_coretemp = True
temp_scale = "celsius"

# Show CPU stats
show_cpu_info = True
show_cpu_stats = True

# Memory display
show_mem_info = True
mem_graphs = True
show_swap = True

# Disk display
show_disks = True
use_fstab = True
disk_free_priv = False
show_io_stat = True
io_mode = False
io_graph_combined = False

# Network display
net_download = "10M"
net_upload = "10M"
net_auto = True
net_sync = False

# Battery display
show_battery = True

# Theme settings
theme_background = True
truecolor = True
rounded_corners = True
graph_symbol = "braille"

# Layout presets (0-9)
preset = "0"

# Log level
log_level = "WARNING"

Installation Steps

βœ… Complete Installation Guide

Step 1: System Configuration

# Create modules directory sudo mkdir -p /etc/nixos/modules # Edit main configuration sudo kate /etc/nixos/configuration.nix # Edit each module file sudo kate /etc/nixos/modules/hardware.nix sudo kate /etc/nixos/modules/boot.nix # ... etc for each module # IMPORTANT: Adjust these in the files: # - users.nix: Change 'mike' to your username # - networking.nix: Change hostname # - hardware.nix: Choose Intel or AMD CPU # - configuration.nix: Set your timezone # Test configuration sudo nixos-rebuild test # If successful, apply sudo nixos-rebuild switch

Step 2: User Configuration

# Create config directories mkdir -p ~/.config/hypr mkdir -p ~/.config/waybar mkdir -p ~/.config/foot mkdir -p ~/.config/fish # Copy configurations using kate kate ~/.config/hypr/hyprland.conf kate ~/.config/waybar/config kate ~/.config/waybar/style.css kate ~/.config/foot/foot.ini kate ~/.config/fish/config.fish # Set permissions chmod +x ~/.config/waybar/config

Step 3: Post-Installation

# Reboot sudo reboot # After reboot: # 1. Login with your username # 2. Password is "changeme" - change it immediately: passwd # Test everything is working: # - Alt+Return: Open terminal # - Alt+D: Open app launcher # - Alt+1-9: Switch workspaces

Troubleshooting

If Hyprland doesn't start: If waybar doesn't appear: