My nix configurations

Files
README.md

My nix configuration stuff

To generate hardware config for a host: nixos-generate-config --show-hardware-config > hosts//hardware.nix

To upgrade: sudo nixos-rebuild switch --flake .#

To update: nix flake update

Sidekick desktop #

modules/desktop/niri.nix provides the reusable Niri/password-login desktop. desktop.noctalia.enable = true opts into Noctalia's panel, launcher and notification daemon (currently enabled only on sidekick). Without it, the launcher/notifications use fuzzel/mako. Noctalia uses the pinned pkgs.noctalia 5.0.1 native release, not the legacy Quickshell package.

modules/desktop/apps.nix provides the reusable desktop.apps.enable opt-in, currently enabled only on sidekick: Zen is the default web/HTML browser and Moonlight Qt is the streaming client. The module also provides 1Password GUI/CLI with Niri autostart and a TIDAL web shortcut. Zen reuses home/kaij/zen.nix and its existing policies/extensions, without managing or migrating any browser profiles. Sidekick's native nixpkgs has no Zen package, so it uses the existing locked zen-browser input's unwrapped 1.19.11b, wrapped by host-native nixpkgs; no input update is required. Firefox is not installed by this opt-in. Launch Zen with Super+B or zen; launch Moonlight from the launcher or moonlight. Moonlight 6.1.0 supports hardware decoding through the native package, but availability depends on GPU drivers/codecs; select/check its decoder in settings. No streaming server or pairing is configured here.

modules/desktop/screencast.nix provides desktop.screencast.enable, enabled only on sidekick. The pinned niri-autoselect-portal bypasses the desktop ScreenCast chooser; browser permission UI may remain. Start sharing in the app, then select a focused window with Super+Ctrl+W or monitor with Super+Ctrl+M. Streams start blank until selection. Super+Ctrl+0 clears video, not the session; stop sharing in the app. All dynamic casts share the target. General GNOME/GTK portal routing and keyring stay unchanged. See the host README for privacy and runtime checks.

Super is the modifier:

  • T: Ghostty; B: Zen on sidekick (Firefox without the apps opt-in); R: launcher; L: lock.
  • Minus / Equal: column 10 percentage points narrower / wider.
  • Shift+Minus / Shift+Equal: window 10 percentage points shorter / taller.
  • Arrows: focus; Shift+arrows: move window/column.
  • Page Up/Down: workspace; Ctrl+Page Up/Down: move column to workspace.
  • 1–5: workspace; Shift+1–5: move column to workspace.
  • F: maximize column; Shift+F: fullscreen; V: floating; Tab: overview.
  • Shift+Q: close; Shift+E: logout; Escape: key guide.

With Noctalia enabled it owns locking and idle; swaylock/swayidle are disabled. Super+L and the menu use its native locker. Idle lock stays at 600 seconds; both screens power off about a minute later (660 seconds unlocked, 60 seconds of inactivity while locked, plus native 2-second fade). Keyboard/mouse activity wakes the lock screen. Downloads continue; no automatic idle suspend is added. The menu's Suspend runs native lock-and-suspend (plain Noctalia Suspend intentionally skips locking). External lid/logind sleep uses Noctalia's sleep-delay inhibitor to wait for the locked session. Password unlock uses the system's existing login PAM stack. Password unlock and session-menu suspend/resume were tested on sidekick. Undocked lid-close behavior still needs a separate test. The existing polkit-gnome agent remains the sole authentication agent. Output scaling remains automatic and the keyboard remains US international. With Noctalia disabled, the baseline uses swaylock/swayidle instead.

When switching an active session from mako, stop mako.service and check the owner of org.freedesktop.Notifications after activation before starting Noctalia. The new profile must no longer expose mako's D-Bus activation file; reload the user D-Bus configuration if it still sees that file. Niri reloads its config without logout, but spawn-at-startup only runs on a new compositor start, so start Noctalia once manually inside the existing user session. Do not restart Niri, log out, or reboot just to apply this polish.