Two declared-but-non-functional option subsystems in core/home were
documented in OPTIONS.md and actively misleading users.
1. `nomarchy.behavior.hyprland.{bindings,input,windowRules,autostart}`
were declared in core/home/behavior.nix with a `behaviorConfigs`
mapping let-binding — both completely unread elsewhere in the tree.
The actual hypr/*.conf files are deployed by
features/desktop/hyprland/default.nix with `lib.mkDefault`,
unconditionally. Setting `behavior.hyprland.bindings = false` had
zero effect. OPTIONS.md's "Disable Nomarchy's default Hyprland
keybindings" example was a lie. Removed the four dead options,
deleted behavior.nix entirely, dropped the import from
core/home/default.nix, and rewrote the OPTIONS.md example to use
`xdg.configFile."hypr/bindings.conf".source = ./mine` (which
actually works against the existing `lib.mkDefault` priority).
2. `nomarchy.overrides.{enable,paths}` advertised a file-based override
loader that doesn't exist. The module created
`~/.config/nomarchy/overrides/{hypr,waybar,apps}` directories and
wrote a README claiming "place files here to override upstream
defaults" — but `getOverrideOrDefault` was never called and `paths`
was never populated. Rewrote core/home/overrides.nix to keep just
the option declarations (so configs that already set these still
evaluate) and marked them clearly as reserved/no-op in OPTIONS.md.
Removed the misleading README write and dir-creation. Logged a
Next-column roadmap row for implementing the loader properly.
While here:
- Clarified `nomarchy.configOverrides` (the *working* bulk-redirect
mechanism) vs `nomarchy.overrides.*` (the reserved one) in OPTIONS.md
— they're different things and the "See Overrides below" link was
pointing at the broken subsystem.
- Fixed OPTIONS.md `nomarchy.iconsTheme` / `nomarchy.isLightMode`
default text — both are derived from the active theme in
core/home/state.nix, not the static literals the docs claimed.
- Updated docs/AGENT.md §2 and docs/STRUCTURE.md to reflect the
behavior.nix removal and the overrides.nix reservation.
Found during Pillar 8 audit of core/home modules.
15 KiB
Nomarchy Options Reference
Every option Nomarchy exposes for downstream flakes. Paths under nomarchy.system.* are NixOS options (set in system.nix); paths under nomarchy.* (no system segment) are Home Manager options (set in home.nix). nomarchy.hardware.* is NixOS.
The installer-generated configuration writes a few of these for you (timezone, formFactor, hardware vendor flags, keymap, locale). Anything not listed there is opt-in — set it yourself.
To see the live default for any option:
nix eval .#nixosConfigurations.<host>.config.nomarchy.system.<path>
nix eval .#homeConfigurations.<user>.config.nomarchy.<path>
NixOS options (system.nix)
nomarchy.system.dns
DNS provider. One of "DHCP" (default), "Cloudflare", "Google", "Custom". With "Custom", set nomarchy.system.customDns to a list of nameservers. Anything other than "DHCP" also enables services.resolved with DNSSEC and DNS-over-TLS.
Defined in core/system/options.nix; wired in core/system/network.nix.
nomarchy.system.customDns
listOf str, default []. Nameservers used when dns = "Custom".
nomarchy.system.wifi.powersave
bool, default true. Sets networking.networkmanager.wifi.powersave. Turn off if you see drops on idle Wi-Fi.
nomarchy.system.timezone
str, default "UTC". The installer writes time.timeZone directly, so this option is informational unless you wire it into your own modules.
nomarchy.system.formFactor
enum [ "laptop" "desktop" ], default "laptop". Drives UI affordances and the laptop power preset. The installer auto-detects via /sys/class/power_supply/BAT*. The default is "laptop" because the battery widget renders empty when no battery is present — safe on a desktop, useful on a laptop.
Wired in features/desktop/waybar/default.nix (filters the battery widget out on desktop), features/scripts/battery-monitor.nix (skips the timer on desktop), and nomarchy.system.laptop.enable (defaults true when this is "laptop").
nomarchy.system.theme
str, default "summer-night". Theme name. Mirror of the home-side nomarchy.theme. Set both if you also want NixOS-side modules (e.g. SDDM theming) to follow.
nomarchy.system.features.fingerprint
bool, default false. Enables services.fprintd.enable.
nomarchy.system.features.fido2
bool, default false. Enables security.pam.u2f (sufficient, with cue).
nomarchy.system.features.hybridGPU
bool, default false. NVIDIA-hybrid laptop support. Wires:
services.supergfxd.enablefor runtime mode switching (Integrated/Hybrid/Vfio/AsusEgpu), driven bynomarchy-toggle-hybrid-gpu.- The NVIDIA driver stack (
services.xserver.videoDrivers = ["nvidia"],hardware.graphics.{enable,enable32Bit},hardware.nvidia.{modesetting,powerManagement}.enable,boot.kernelParams = ["nvidia-drm.modeset=1"]).
All driver knobs use lib.mkDefault, so a downstream system.nix can pin a beta driver or flip to the open kernel module without forking the module.
You still have to add bus IDs — they're per-machine and can't be derived from any flag. Find them with lspci -D | grep -E 'VGA|3D', then in your /etc/nixos/system.nix:
hardware.nvidia.prime = {
offload.enable = true;
offload.enableOffloadCmd = true;
intelBusId = "PCI:0:2:0"; # or `amdgpuBusId` for AMD iGPU
nvidiaBusId = "PCI:1:0:0";
};
Without prime config, supergfxd still switches modes but render-offload via nvidia-offload <cmd> is unavailable.
nomarchy.system.snapper.enable
bool, default false. BTRFS timeline snapshots of /. Auto-disables when / isn't BTRFS. Includes a nixos-rebuild-snap wrapper that takes a "Pre-rebuild" snapshot before each switch.
nomarchy.system.hibernation.enable
bool, default false. Suspend-then-hibernate on lid close, idle, and power button. Requires a disk swap device or swapfile sized to at least RAM — zRAM alone is not enough.
nomarchy.system.hibernation.idleMinutes
int, default 30. Idle minutes before suspend-then-hibernate fires.
nomarchy.system.laptop.enable
bool, default nomarchy.system.formFactor == "laptop". Laptop power preset: TLP (with sane AC/battery governors and ThinkPad-style 75/80 charge thresholds), services.upower, services.thermald (gated by laptop.thermald), and a brightnessctl udev rule so the existing nomarchy-brightness-{display,keyboard} scripts run without root. Force-disables services.power-profiles-daemon (mutually exclusive with TLP) — to use PPD instead, set laptop.enable = false and wire it yourself. Lid-close action defers to nomarchy.system.hibernation.enable: suspend-then-hibernate when on, suspend otherwise. Charge thresholds are only honored on supported hardware (ThinkPad, some ASUS); harmless warning elsewhere.
nomarchy.system.laptop.thermald
bool, default true on x86_64. Enables services.thermald (Intel thermal daemon). Harmless no-op on AMD; gated off on aarch64.
nomarchy.system.desktop.enable
bool, default nomarchy.system.formFactor == "desktop". Desktop preset: pins powerManagement.cpuFreqGovernor to "performance" (via mkDefault) and enables services.zfs.autoScrub + services.zfs.trim so a future ZFS pool gets sensible maintenance without further config. The ZFS knobs are no-ops until you add boot.supportedFilesystems = [ "zfs" ] (plus networking.hostId) and a pool. Battery-widget filtering is handled by formFactor itself, so this preset doesn't repeat it.
nomarchy.system.accessibility.enable
bool, default false. Accessibility preset: enables services.gnome.at-spi2-core (AT-SPI2 framework), installs pkgs.orca (screen reader) into environment.systemPackages, and sets XCURSOR_SIZE to accessibility.cursorSize. Off by default — accessibility is a personal preference, not hardware-derived. The Hyprland-side bits (slower key-repeat, Orca launch keybinding, high-contrast palette) are a separate roadmap item.
nomarchy.system.accessibility.cursorSize
int, default 32. XCURSOR_SIZE when accessibility.enable = true. NixOS default is 24; 32 is a safer floor for low-vision users.
nomarchy.system.gaming.enable
bool, default false. Gaming preset: enables programs.steam (with remotePlay and localNetworkGameTransfers firewall holes opened by mkDefault), programs.gamemode (the launching user must be in the gamemode group), and services.flatpak. The flathub remote isn't added declaratively — after first boot, run flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo. Pair with the home-side companion nomarchy.gaming.enable for the Hyprland fullscreen-on-Steam-launch window rule.
nomarchy.system.containers.enable
bool, default false. Rootless Podman with Docker compatibility (docker → podman), plus podman-compose, podman-tui, and dive.
nomarchy.system.virtualization.libvirt.enable
bool, default false. libvirt daemon, virt-manager, and OVMF. Add your user to the libvirtd group.
nomarchy.system.virtualization.docker.enable
bool, default false. Docker daemon and docker-compose. Add your user to the docker group.
nomarchy.system.keyring.enable
bool, default true. Auto-unlock GNOME Keyring at login and route SSH keys through gcr-ssh-agent. On by default — near-universal QoL improvement.
nomarchy.system.inputMethod.enable
bool, default false. fcitx5 input method for CJK / IME. Wires NixOS's i18n.inputMethod and autostarts fcitx5-daemon.
nomarchy.system.voxtype.enable
bool, default false. voxtype voice-typing integration. voxtype isn't packaged in nixpkgs — when you enable this, install voxtype yourself (e.g. home.packages = [ (pkgs.callPackage … {}) ]). With this off the SUPER+CTRL+X keybinding and waybar widget are no-ops.
nomarchy.hardware.isXPS
bool, default false. Dell XPS fixes — haptic touchpad service and PCI/I²C power-control udev rules.
nomarchy.hardware.isT2Mac
bool, default false. Apple T2 MacBook fixes — IOMMU kernel params, apple-bce module, brcmfmac feature mask.
nomarchy.hardware.isFramework
bool, default false. Framework laptop QMK HID udev rule.
nomarchy.hardware.fwupd
bool, default false. Enables services.fwupd firmware update service.
nomarchy.hardware.hasIPU7Camera
bool, default false. Intel IPU7 camera support (kernel modules + firmware).
impermanence.enable
bool, default false. Erase Your Darlings root wipe on boot. Defined in core/system/impermanence.nix. The installer writes the flag based on the impermanence prompt.
Home Manager options (home.nix)
nomarchy.theme
str, default "summer-night". Active theme name. Available themes are the directories under themes/palettes/.
nomarchy.panelPosition
enum ["top", "bottom"], default "top". Waybar panel position.
nomarchy.formFactor
enum [ "laptop" "desktop" ], default "laptop". Mirror of nomarchy.system.formFactor. Filters laptop-only widgets out of waybar (battery) when set to "desktop". The installer writes both system and home values together.
nomarchy.wallpaper
str, default "". Absolute path to a wallpaper override. Empty string means "use the active theme's default wallpaper".
nomarchy.toggles.suspend
bool, default true. Whether suspend appears in the system menu.
nomarchy.toggles.screensaver
bool, default true. Whether the screensaver is enabled.
nomarchy.toggles.idle
bool, default true. Whether the idle lock is enabled (hypridle).
nomarchy.toggles.nightlight
bool, default false. Enables hyprsunset.
nomarchy.toggles.waybar
bool, default true. Whether the top bar is deployed at all.
nomarchy.toggles.skipVsCodeTheme
bool, default false. Skip theme overrides in VSCode — useful if you manage VSCode themes yourself.
nomarchy.nightlightTemperature
int, default 4000. Nightlight color temperature (Kelvin).
nomarchy.hyprland.gaps_in
int, default 5. Inner gaps.
nomarchy.hyprland.gaps_out
int, default 10. Outer gaps.
nomarchy.hyprland.border_size
int, default 2. Window border width.
nomarchy.fonts.monospace
str, default "JetBrainsMono Nerd Font". Used by terminals, VSCode, etc.
nomarchy.iconsTheme
str, default derived from the active theme (falls back to "Yaru-blue"). GTK/Qt icon theme name. core/home/state.nix computes this from the theme's palette metadata; override to pin a specific icon theme regardless of palette.
nomarchy.isLightMode
bool, default derived from the active theme. Whether the active theme is a light theme. core/home/state.nix computes this from the theme directory; affects nightlight defaults and a few app theme decisions. Override only if you need to force a specific value.
nomarchy.cursor.name
str, default "Bibata-Modern-Ice". Cursor theme name.
nomarchy.cursor.package
package, default pkgs.bibata-cursors. Package providing the cursor theme. Override both name and package together if you switch themes.
nomarchy.configOverrides
nullOr path, default null. Path to a replacement config directory. When set, the items listed in core/home/configs.nix (fastfetch, fcitx5, fontconfig, git, imv, nautilus-python, nomarchy, nomarchy-skill, uwsm, wiremix, plus the loose files) are read from <this-path>/<name> instead of the bundled defaults. Distinct from nomarchy.overrides.* below — configOverrides is a working bulk redirect; overrides.* is a reserved option surface (currently a no-op).
nomarchy.apps.opencode.enable
bool, default false. opencode AI coding CLI integration. Deploys ~/.config/opencode/opencode.json. The opencode package itself is not installed by Nomarchy — add it to your home.packages.
nomarchy.gaming.enable
bool, default false. Home-side companion to nomarchy.system.gaming.enable. Adds a Hyprland windowrulev2 = fullscreen, class:^(steam_app_).*$ so games launched through Steam grab the whole screen instead of opening windowed. Set to the same value as the system option; the installer flips both when the Gaming profile is selected.
nomarchy.vscode.devExtensions
bool, default false. Install Nomarchy's curated VSCode extension pack (Nix, language servers, theme variants).
nomarchy.themeLoader.enable
bool, default true. Auto-load theme-specific app configs (btop, waybar, mako, kitty, alacritty) from the active theme. Disable if you want to provide your own.
nomarchy.themeLoader.apps.{btop,waybar,mako,kitty,alacritty}
bool, default true each. Per-app toggles for the theme loader — pick which apps follow the active theme.
nomarchy.overrides.enable
bool, default true. Reserved — currently a no-op. Intended to gate a future file-based override loader (drop a file under ~/.config/nomarchy/overrides/, have it substitute the bundled default for that path). The option exists so configs that set it don't fail to evaluate; setting it has no effect today. Use nomarchy.configOverrides for bulk redirection, or set xdg.configFile.<path>.source directly in your home.nix for per-file overrides — Nomarchy's defaults use lib.mkDefault and yield to higher-priority assignments. Tracked in docs/ROADMAP.md.
nomarchy.overrides.paths
attrsOf path, default {}. Reserved — currently unused. Will be populated by the future override loader.
Examples
Minimal system.nix for a desktop with Cloudflare DNS, Snapper, and rootless Podman
{
nomarchy.system = {
dns = "Cloudflare";
formFactor = "desktop";
snapper.enable = true;
containers.enable = true;
};
}
Minimal home.nix for a Tokyo-night user with custom gaps and opencode
{
nomarchy = {
theme = "tokyo-night";
hyprland.gaps_in = 8;
hyprland.gaps_out = 16;
apps.opencode.enable = true;
};
}
Ship your own Hyprland keybindings instead of Nomarchy's defaults
Nomarchy deploys its bindings.conf with lib.mkDefault, so a higher-priority assignment from your own home.nix wins:
{
xdg.configFile."hypr/bindings.conf".source = ./my-bindings.conf;
}
The same pattern works for any file Nomarchy deploys via xdg.configFile.<path>.source = lib.mkDefault … — point at your own file and skip the default.
Where these are defined
core/system/options.nix— mostnomarchy.system.*optionscore/system/hardware.nix—nomarchy.hardware.*core/system/impermanence.nix—impermanence.enablecore/home/options.nix— most home-sidenomarchy.*optionscore/home/overrides.nix—nomarchy.overrides.*(reserved; currently no-op)themes/engine/loader.nix—nomarchy.themeLoader.*features/apps/vscode.nix—nomarchy.vscode.*