5 08 Quick Reference
Nimmo edited this page 2026-05-30 22:40:08 +01:00

Chapter 8: Quick Reference

A condensed reference for daily use. Bookmark this page.

Essential Commands

# Validate configuration (always do this first)
nix flake check

# Deploy to current host (auto-detects hostname and specialisation)
nixos-rebuild-auto

# Deploy to specific hosts (run on or targeted at the named machine)
sudo nixos-rebuild switch --flake .#electra
sudo nixos-rebuild switch --flake .#lena
sudo nixos-rebuild switch --flake .#vega

# Test without adding to boot menu (reverts on reboot)
sudo nixos-rebuild test --flake .#electra

# Build without activating
sudo nixos-rebuild build --flake .#electra

# Show what would change (dry run)
sudo nixos-rebuild dry-activate --flake .#electra

# Switch GPU tier on electra (select at boot menu; bootloader remembers last choice)
# Boot entries:  battery (base)  /  igpu  /  dgpu

# Update all inputs
nix flake update

# Update one input
nix flake update claude-code-nix

# Search for packages
nix search nixpkgs <name>

# Check a package version
nix eval nixpkgs#<package>.version

# Garbage collect
sudo nix-collect-garbage -d          # Remove ALL old generations
sudo nix-collect-garbage --delete-older-than 7d  # Keep recent

# List generations
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system

# Rollback to generation N
sudo nix-env --switch-generation N --profile /nix/var/nix/profiles/system
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch

Where to Put Things

What you want to do File to edit
Add package for all users, all hosts modules/common/system.nix
Add desktop app for all desktop hosts modules/desktop/apps.nix
Add package for nimmo, all hosts home/nimmo.nix
Add package for nimmo, desktop hosts only home/nimmo.nix behind !isServer check
Add package for nimmo, all electra tiers hosts/electra/default.nix (or via a profile)
Add package for electra igpu + dgpu tiers only Inside both specialisation blocks in hosts/electra/default.nix
Add package for dgpu tier only Inside specialisation.dgpu.configuration in hosts/electra/default.nix
Add package for one host only hosts/<hostname>/default.nix
Configure nimmo's shell, git, or dotfiles home/nimmo.nix
Change bootloader or networking defaults modules/common/base.nix
Change timezone or locale modules/common/locale.nix
Change Nix build settings or binary caches modules/common/nix-settings.nix
Change shared electra config (all tiers) hosts/electra/default.nix (outside specialisation blocks)
Change iGPU base hardware config hosts/electra/hardware.nix
Change dgpu hardware config hosts/electra/hardware-dgpu.nix
Add a new reusable feature modules/<category>/<name>.nix
Add a new user users/<name>.nix
Add a new host hosts/<name>/default.nix + flake.nix
Add an external flake dependency flake.nix inputs section

File Quick Guide

flake.nix                             -- Inputs, makeNixosSystem helper, host definitions
flake.lock                            -- Pinned versions (never edit by hand)
home/nimmo.nix                        -- Nimmo's home-manager config: packages, shell, git, dotfiles
home/plasma.nix                       -- Declarative KDE Plasma settings (via plasma-manager)
hosts/electra/default.nix             -- Electra: base (battery) + igpu + dgpu specialisations
hosts/electra/hardware.nix            -- AMD iGPU configuration (base and igpu tiers)
hosts/electra/hardware-dgpu.nix       -- NVIDIA/AMD Prime offload (dgpu specialisation only)
hosts/lena/default.nix                -- Lena: tablet mode, two users
hosts/lena/disko.nix                  -- Btrfs partition layout (lena)
hosts/vega/default.nix                -- Vega: headless server, AI agents, storage mounts
hosts/vega/disko.nix                  -- Disk partitioning (vega)
modules/common/base.nix               -- Foundation for ALL hosts: bootloader, networking, sops, GC
modules/common/default-config.nix     -- nixosConfig.* portability options (user, email, paths)
modules/common/locale.nix             -- en_GB, Europe/London, UK keyboard
modules/common/nix-settings.nix       -- Flakes, caches, build parallelism, allowUnfree
modules/common/sops-host.nix          -- sops-nix host key configuration
modules/common/system.nix             -- System-wide packages: git, htop, jq, sops tools, etc.
modules/boot/silent-boot.nix          -- Plymouth, quiet kernel params
modules/desktop/apps.nix              -- Desktop apps (Kate, LibreOffice, VLC, etc.)
modules/desktop/environment.nix       -- Desktop foundation: system.nix + fonts + printing + removable storage
modules/desktop/fonts.nix             -- Font packages and fontconfig defaults
modules/desktop/goose.nix             -- Goose desktop app (deb packaging)
modules/desktop/plasma.nix            -- KDE Plasma 6 desktop environment
modules/hardware/bluetooth.nix        -- Bluetooth with experimental features
modules/hardware/expansion-card-mount.nix -- 1TB expansion card automount (electra only)
modules/hardware/laptop.nix           -- Shared laptop hardware (upower, powertop, endurance mode option)
modules/hardware/printing.nix         -- CUPS printing support
modules/hardware/removable-storage.nix -- udisks2, NTFS support, polkit mount rules
modules/maintenance/garbage-collection.nix -- Daily GC, 3-day age limit
modules/maintenance/btrfs-maintenance.nix  -- Monthly btrfs scrub
modules/networking/wifi-networks.nix  -- Known Wi-Fi networks (desktop hosts)
modules/networking/wireguard-vpn.nix  -- WireGuard VPN client (desktop hosts)
modules/power/auto-power-profile.nix  -- Battery-triggered switching + manual override guard
modules/profiles/ai-agents.nix        -- Claude Code, Codex CLI, nixd LSP, Claude MCP plugin, credentials
modules/profiles/ai-desktop.nix       -- Imports ai-agents + opencode + desktop launchers + Ollama providers
modules/profiles/gaming.nix           -- Steam, GameMode, MangoHud, Discord
modules/profiles/maker.nix            -- 3D printing, electronics, CAD tools
modules/server/base.nix               -- Server foundation: SSH, mosh, network tools
modules/services/backrest.nix         -- Automated backups via Backrest/restic to NAS
modules/services/beszel-agent.nix     -- System monitoring agent (all hosts)
modules/services/btrbk-home.nix       -- Hourly btrfs snapshots of /home (electra)
modules/services/nixos-auto-update.nix -- Daily flake update + rebuild
modules/profiles/ollama.nix           -- Ollama/Open WebUI profile for AMD and NVIDIA instances
modules/services/ollama-common.nix    -- Shared Ollama service helper
modules/virtualization/docker.nix     -- Docker (basic)
modules/virtualization/docker-amd.nix -- Docker with AMD iGPU (ROCm) access
modules/virtualization/docker-nvidia.nix -- Docker with NVIDIA dGPU access
users/nimmo.nix                       -- Nimmo user account definition (groups only)
users/claire.nix                      -- Claire user account (lena only)
secrets/secrets.yaml                  -- Encrypted secrets (sops-nix, age-encrypted)
secrets/README.md                     -- Secrets management documentation
scripts/check-flake.sh                -- Container-based flake validation (podman)

Nix Language Cheat Sheet

# Strings
"hello"
"hello ${name}"
''multi
  line''

# Lists (space-separated, no commas)
[ "a" "b" "c" ]

# Attrsets
{ key = "value"; nested.key = "value"; }

# Functions
x: x + 1
{ config, pkgs, ... }: { /* module */ }

# Let bindings
let x = 1; in x + 2

# With (bring attrset into scope)
with pkgs; [ firefox git ]

# Inherit (copy from outer scope)
{ inherit inputs; }  # same as { inputs = inputs; }

# If
if x then y else z

# Import
import ./file.nix

# Priority
lib.mkDefault value     # Low priority
lib.mkForce value       # High priority

# Conditional config
config = lib.mkIf cfg.enable { ... };

# Optional list items
lib.optionals condition [ "a" "b" ]

Module Template

Simple module (no options)

{ config, pkgs, ... }:

{
  # Set options here
  services.something.enable = true;
  environment.systemPackages = [ pkgs.something ];
}

Module with options

{ config, lib, pkgs, ... }:

let
  inherit (lib) mkEnableOption mkOption mkIf types;
  cfg = config.services.myservice;
in {
  options.services.myservice = {
    enable = mkEnableOption "my service";
    port = mkOption {
      type = types.port;
      default = 8080;
    };
  };

  config = mkIf cfg.enable {
    # Configuration that activates when enabled
  };
}

Systemd Service Template

# Oneshot service with timer
systemd.services.my-service = {
  description = "My service description";
  serviceConfig = {
    Type = "oneshot";
    ExecStart = pkgs.writeShellScript "my-service" ''
      # Script content
      echo "hello"
    '';
  };
};

systemd.timers.my-service = {
  wantedBy = [ "timers.target" ];
  timerConfig = {
    OnCalendar = "daily";     # or "hourly", "weekly", "*-*-* 00/6:00:00"
    Persistent = true;         # Catch up after sleep/shutdown
    RandomizedDelaySec = "5min";
  };
};

Useful Resources

Resource URL
Package search https://search.nixos.org/packages
Option search https://search.nixos.org/options
NixOS Wiki https://wiki.nixos.org/
NixOS Discourse https://discourse.nixos.org/
Nix language reference https://nix.dev/manual/nix/latest/language/
nixos-hardware modules https://github.com/NixOS/nixos-hardware
Flake reference https://nix.dev/manual/nix/latest/command-ref/new-cli/nix3-flake

Service Monitoring

# Check running services
systemctl list-units --type=service --state=running

# Check timers
systemctl list-timers --all

# View service logs
journalctl -u <service-name> -f               # Follow live
journalctl -u <service-name> -b               # Current boot
journalctl -u <service-name> --since "1h ago" # Last hour

# Your custom services:
journalctl -u auto-power-profile.service      # Power management
journalctl -u backrest.service                # Backups
journalctl -u beszel-agent.service            # System monitoring agent
journalctl -u nixos-auto-update.service       # Auto updates
journalctl -u nix-gc.service                  # Garbage collection
journalctl -u btrbk-home.service              # btrfs snapshots (electra)

Just Recipes

just check                          # Validate flake syntax
just deploy                         # Deploy current config (auto-detects specialisation)
just deploy igpu                    # Deploy and activate specific specialisation
just test                           # Test without adding to boot menu
just build                          # Build without activating
just switch-spec igpu               # Switch specialisation without rebuild
just power-profile powersave        # Temporarily set profile; auto resumes at <=25%
just power-profile auto             # Return to automatic power profile switching
just plasma-capture                 # Capture current KDE Plasma settings to home/plasma.nix
just add-host HOSTNAME              # Scaffold a new host directory
just add-secret HOSTNAME            # Register a new host for secret decryption
just edit-secrets                   # Edit encrypted secrets interactively
just gc                             # Run garbage collection
just generations                    # List system generations
just firmware-update                # Update firmware via LVFS

Update Commands

just auto-update-run-now       # Trigger scheduled update immediately
just auto-update-last-run      # Show last run status
sudo nixos-auto-update --force       # Force flake update (ignore 6h freshness window)
just diff-last-update                # Show package changes between last two generations
cat /var/log/nixos-auto-update-error.log  # Inspect error if last run failed

Git Workflow Summary

# Before making changes
git pull --rebase --autostash

# After editing files
git pull --rebase --autostash # Re-run before committing if time has passed
git add <new-files>        # Stage new files (required for flakes)
nix flake check            # Validate
nixos-rebuild-auto         # Deploy
git add -A
git commit -m "description of change"
git push

# Undo uncommitted changes
git restore <file>         # Restore one file
git restore .              # Restore everything

# Undo a bad flake update
git log --oneline flake.lock
git checkout <good-commit> -- flake.lock
nixos-rebuild-auto
git commit -m "revert: Roll back flake inputs"
git push