# Minimal niri desktop for enzo — deliberately separate from ../../profiles/desktop.nix # so the laptop can grow on its own terms. Add to it (or switch to the shared # profile) whenever you want more. { pkgs, ... }: { # --- Session / login --- programs.niri.enable = true; programs.dconf.enable = true; # Tell the desktop it's in dark mode. Apps read light/dark from # xdg-desktop-portal's Settings interface (org.freedesktop.appearance # color-scheme). This dconf default is the value the portal serves. programs.dconf.profiles.user.databases = [ { settings."org/gnome/desktop/interface".color-scheme = "prefer-dark"; } ]; # Serve color-scheme from the *gtk* portal backend, not gnome. The niri module # routes Settings to xdg-desktop-portal-gnome (its default), but that backend # relies on gnome-settings-daemon — absent under bare niri — so it reports # "no preference" and web content (LibreWolf's prefers-color-scheme) stays # light even though GTK chrome follows the dark GTK theme. xdg-desktop-portal- # gtk reads the dconf color-scheme above directly, so pinning Settings to it # makes the portal actually report dark and content follows. This key merges # into the niri module's xdg.portal.config.niri. xdg.portal = { extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; config.niri."org.freedesktop.impl.portal.Settings" = "gtk"; }; services.greetd = { enable = true; settings.default_session = { command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --cmd niri-session"; user = "greeter"; }; }; # Let tuigreet write its cache (for --remember). systemd.services.greetd.serviceConfig = { Type = "idle"; StandardInput = "tty"; StandardOutput = "tty"; StandardError = "journal"; TTYReset = true; TTYVHangup = true; TTYVTDisallocate = true; }; # --- Graphics --- hardware.graphics.enable = true; # --- Audio (playback only; no rtkit/jack — enzo isn't for recording). # If you ever hear dropouts under load, add: security.rtkit.enable = true; services.pulseaudio.enable = false; services.pipewire = { enable = true; alsa.enable = true; pulse.enable = true; }; # --- Fonts (minimal) --- # TODO move to common fonts = { enableDefaultPackages = true; packages = with pkgs; [ noto-fonts nerd-fonts.symbols-only adwaita-fonts ]; fontconfig = { enable = true; defaultFonts = { monospace = [ "Adwaita Mono" ]; }; }; }; environment.sessionVariables = { XCURSOR_THEME = "Adwaita"; XCURSOR_SIZE = "24"; }; # Cursor theme referenced by XCURSOR_THEME / niri's xcursor-theme. Without this # package the Adwaita cursor files aren't on disk, so named shapes (e.g. the # link "pointer"/hand) fail to load and the cursor never changes on hover. environment.systemPackages = [ pkgs.adwaita-icon-theme ]; # --- User: groups + niri essentials --- users.users.hwebs.extraGroups = [ "audio" "input" ]; # Firefox: blank home/new-tab and no bookmarks toolbar, delivered as an # enterprise policy (no profile to manage). Dark theme is not configured here # — it comes from the desktop portal (color-scheme dconf + Settings=gtk # above), which Firefox honors for both chrome and web content. (LibreWolf was # tried instead but forces content light via its fingerprinting protection # even with resistFingerprinting off, so plain Firefox is the better fit.) programs.firefox = { enable = true; preferencesStatus = "default"; preferences = { # Blank home page + blank new tab "browser.startup.homepage" = "about:blank"; "browser.startup.page" = 0; # 0 = blank on startup "browser.newtabpage.enabled" = false; # Hide the bookmarks toolbar "browser.toolbars.bookmarks.visibility" = "never"; }; }; users.users.hwebs.packages = with pkgs; [ ghostty # terminal fuzzel # launcher swaybg # wallpaper xwayland-satellite # run X11 apps under niri mako # notifications libnotify # notify-send yambar # text status bar gnupg # gpg pinentry-gnome3 # passphrase prompt for the gpg agent ]; # --- GPG --- # Agent + a GTK pinentry (works under niri). enableSSHSupport is left off so # gpg-agent doesn't hijack the ssh-agent socket for your existing SSH key; # turn it on only if you sign in via a GPG auth subkey. programs.gnupg.agent.enable = true; # --- Console / greeter font (HiDPI panel) --- # The eDP panel is high-density, so the kernel VT and tuigreet render with a # tiny 8x16 font. A large Terminus bitmap font makes the TTY and the greeter # legible; earlySetup applies it from initrd so it's big from the first frame. # Sizes: ter-v{16,18,20,22,24,28,32}n — bump/drop to taste. console = { earlySetup = true; packages = [ pkgs.terminus_font ]; font = "ter-v32n"; }; }