# For reference of the available options, see https://docs.noctalia.dev/getting-started/nixos/#config-ref # # To see a diff of the nix-set and GUI-set (current) settings, run: # nix shell nixpkgs#jq nixpkgs#colordiff -c bash -c "colordiff -u --nobanner <(jq -S . ~/.config/noctalia/settings.json) <(noctalia-shell ipc call state all | jq -S .settings)" { config, lib, pkgs, inputs, ... }: with lib; let cfg = config.noctaliaShell; in { imports = [ inputs.noctalia.homeModules.default ]; options.noctaliaShell = { enable = mkEnableOption "Noctalia shell"; colorScheme = mkOption { type = types.str; default = "Noctalia (default)"; description = '' Predefined color scheme to use. Options include: "Noctalia (default)", "Monochrome", "Catppuccin Mocha", etc. See Noctalia docs for full list. ''; }; useWallpaperColors = mkOption { type = types.bool; default = false; description = "Generate colors from wallpaper instead of using predefined scheme"; }; darkMode = mkOption { type = types.bool; default = true; description = "Use dark mode for Noctalia shell"; }; barPosition = mkOption { type = types.enum [ "top" "bottom" "left" "right" ]; default = "top"; description = "Position of the Noctalia bar"; }; barDensity = mkOption { type = types.enum [ "spacious" "comfortable" "default" "compact" "mini" ]; default = "default"; description = "Bar density (compact for vertical bars)"; }; enableDock = mkOption { type = types.bool; default = true; description = "Enable the Noctalia dock"; }; dockPosition = mkOption { type = types.enum [ "top" "bottom" "left" "right" ]; default = "bottom"; description = "Position of the dock"; }; pinnedApps = mkOption { type = types.listOf types.str; default = [ ]; description = "List of .desktop file names for pinned dock apps"; }; avatarImage = mkOption { type = types.str; default = ""; description = "Path to avatar image for user profile"; }; locationName = mkOption { type = types.str; default = "Denver"; description = "Location name for weather widget"; }; use12hourFormat = mkOption { type = types.bool; default = false; description = "Use 12-hour time format"; }; useFahrenheit = mkOption { type = types.bool; default = false; description = "Use Fahrenheit for temperature"; }; # UI settings fontDefault = mkOption { type = types.str; default = ""; description = "Default font for Noctalia shell"; }; fontFixed = mkOption { type = types.str; default = ""; description = "Monospace font for Noctalia shell"; }; fontDefaultScale = mkOption { type = types.float; default = 1.0; description = "Scale factor for default font"; }; panelBackgroundOpacity = mkOption { type = types.float; default = 0.93; description = "Background opacity for panels"; }; # General settings dimmerOpacity = mkOption { type = types.float; default = 0.2; description = "Opacity for screen dimmer"; }; lockScreenAnimations = mkOption { type = types.bool; default = false; description = "Enable lock screen animations"; }; lockScreenCountdownDuration = mkOption { type = types.int; default = 10000; description = "Lock screen countdown duration in milliseconds"; }; telemetryEnabled = mkOption { type = types.bool; default = false; description = "Enable telemetry for Noctalia"; }; # Bar settings barBackgroundOpacity = mkOption { type = types.float; default = 0.93; description = "Bar background opacity"; }; clockFormat = mkOption { type = types.str; default = "HH:mm ddd, MMM dd"; description = "Clock format for horizontal display"; }; launcherIcon = mkOption { type = types.str; default = "activities"; description = "Icon for the launcher widget"; }; # Wallpaper settings wallpaperDirectory = mkOption { type = types.str; default = ""; description = "Directory containing wallpapers"; }; # Dock settings dockBackgroundOpacity = mkOption { type = types.float; default = 1.0; description = "Dock background opacity"; }; dockSize = mkOption { type = types.float; default = 1.0; description = "Dock size multiplier"; }; # Notification settings notificationLocation = mkOption { type = types.enum [ "top" "top_right" "top_left" "bottom" "bottom_right" "bottom_left" ]; default = "top_right"; description = "Location for notifications"; }; enableMediaToast = mkOption { type = types.bool; default = false; description = "Enable media change toast notifications"; }; # OSD settings osdLocation = mkOption { type = types.enum [ "top" "top_right" "top_left" "bottom" "bottom_right" "bottom_left" "center" ]; default = "top_right"; description = "Location for OSD popups"; }; # Night light settings enableNightLight = mkOption { type = types.bool; default = false; description = "Enable night light feature"; }; nightLightTemp = mkOption { type = types.str; default = "4000"; description = "Night time color temperature"; }; # System monitor settings systemMonitorUseCustomColors = mkOption { type = types.bool; default = false; description = "Use custom colors for system monitor thresholds"; }; systemMonitorWarningColor = mkOption { type = types.str; default = ""; description = "Warning color for system monitor"; }; systemMonitorCriticalColor = mkOption { type = types.str; default = ""; description = "Critical color for system monitor"; }; # Plugin settings pluginsAutoUpdate = mkOption { type = types.bool; default = false; description = "Auto-update Noctalia plugins"; }; # Calendar settings firstDayOfWeek = mkOption { type = types.int; default = (-1); description = "First day of week (-1 for system default, 0=Sunday, 1=Monday)"; }; hideWeatherTimezone = mkOption { type = types.bool; default = false; description = "Hide timezone in weather display"; }; }; config = mkIf cfg.enable { # Configure Noctalia shell via home-manager module programs.noctalia-shell = { enable = true; # Don't install the package separately since systemd service handles it # But we need it for IPC commands in keybinds package = inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default; settings = mkMerge [ # Use mkDefault for all settings to allow per-host overrides (mkDefault { colorSchemes = { useWallpaperColors = cfg.useWallpaperColors; predefinedScheme = cfg.colorScheme; darkMode = cfg.darkMode; }; bar = { position = cfg.barPosition; density = cfg.barDensity; backgroundOpacity = cfg.barBackgroundOpacity; showCapsule = true; floating = false; widgets = { left = [ { id = "Launcher"; icon = cfg.launcherIcon; } { id = "Clock"; formatHorizontal = cfg.clockFormat; } { id = "SystemMonitor"; } { id = "ActiveWindow"; } { id = "MediaMini"; } ]; center = [ { id = "Workspace"; } ]; right = [ { id = "Tray"; } { id = "NotificationHistory"; } { id = "Battery"; } { id = "Volume"; } { id = "Brightness"; } { id = "ControlCenter"; } ]; }; }; dock = { enabled = cfg.enableDock; position = cfg.dockPosition; displayMode = "auto_hide"; backgroundOpacity = cfg.dockBackgroundOpacity; size = cfg.dockSize; pinnedApps = cfg.pinnedApps; }; general = { avatarImage = cfg.avatarImage; dimmerOpacity = cfg.dimmerOpacity; radiusRatio = 1; animationSpeed = 1; enableShadows = true; lockScreenAnimations = cfg.lockScreenAnimations; lockScreenCountdownDuration = cfg.lockScreenCountdownDuration; telemetryEnabled = cfg.telemetryEnabled; }; ui = { fontDefault = cfg.fontDefault; fontFixed = cfg.fontFixed; fontDefaultScale = cfg.fontDefaultScale; panelBackgroundOpacity = cfg.panelBackgroundOpacity; }; location = { name = cfg.locationName; weatherEnabled = true; use12hourFormat = cfg.use12hourFormat; useFahrenheit = cfg.useFahrenheit; firstDayOfWeek = cfg.firstDayOfWeek; hideWeatherTimezone = cfg.hideWeatherTimezone; }; wallpaper = { enabled = true; directory = cfg.wallpaperDirectory; }; notifications = { enabled = true; location = cfg.notificationLocation; enableMediaToast = cfg.enableMediaToast; }; osd = { enabled = true; location = cfg.osdLocation; }; nightLight = { enabled = cfg.enableNightLight; autoSchedule = true; nightTemp = cfg.nightLightTemp; }; systemMonitor = { useCustomColors = cfg.systemMonitorUseCustomColors; warningColor = cfg.systemMonitorWarningColor; criticalColor = cfg.systemMonitorCriticalColor; }; plugins = { autoUpdate = cfg.pluginsAutoUpdate; }; appLauncher = { position = "center"; sortByMostUsed = true; viewMode = "list"; }; }) ]; }; # Disable conflicting services that Noctalia replaces services.swayosd.enable = mkForce false; services.swaync.enable = mkForce false; # Disable wlsunset - Noctalia has built-in night light services.wlsunset.enable = mkForce false; # Disable waybar - Noctalia has its own bar waybarConfig.enable = mkForce false; programs.waybar.enable = mkForce false; }; }