Files
Nomarchy/docs/OVERRIDES.md
Bernardo Magri 786a8ad30e feat(themes): kiln + kiln-clay — the third exclusive pair, brand new
Completes the three dark/light pairs for v1 (batch: 0ba1762, e51c8a7).
Kiln is a potter's workshop at night, lit only by the kiln: warm
near-black (#1D1815), copper accent (#D68C5C, 6.5:1), brass accentAlt,
CaskaydiaCove, rounding 8. Kiln Clay is the same studio at midday:
cream plaster (#F4EDE3), espresso text (11.1:1 AAA), fired-copper
accent (#A34F1F, 4.89:1), brick-red bad. Both waybars are a NEW
whole-swap identity — 'the workbench': ONE continuous floating plank
(window#waybar carries the surface, modules transparent) — deliberately
distinct from boreal's three pills and slate's edge-to-edge strip;
module set verbatim-parity with the generated config. Matched rofi,
btop themes. The wallpapers share identical ring geometry — banked-coal
heat rings at night, terracotta glaze rings at noon — so the autoTheme
flip visibly rhymes.

Sync sweep in this commit (LOOP §5): README 24->28 presets + the
whole-swap list now names the three pairs; CONVENTIONS waybar parity
list gains the four new slugs; OVERRIDES autoTheme table points at the
pairs; HARDWARE-QUEUE gains the batch V3 entry (real-GL blur, btop
visual, launcher grid, tray menus, pair flip); BACKLOG files #153
(PROPOSED: per-theme desktop widgets — the conky idea, engine spike
needed, not v1).

Verification: V2. Full targeted set green on the final tree:
theme-contrast, theme-wholeswap (previews + backgrounds + CSS
self-containment), waybar-language, waybar-swap-env, rofi-text-width,
state-sync-validate, auto-theme VM; nix flake check --no-build green.
Visual protocol: theme-shot VM desktop + menu viewed for BOTH themes
(plank renders as one island, copper/terracotta semantics, legible
menus; /nix/store/2fizd945...theme-shot-kiln and
/nix/store/0126yd48...theme-shot-kiln-clay). audit-theme-design:
CVD-only findings (≤ executive-slate's own baseline); ANSI slots
in-family after the magenta retune. V3 pending: HARDWARE-QUEUE entry
above. btop visual is VM-blocked (GL terminal never starts under
softGL) — file-level assertions only, listed for hardware.

Design + wallpapers on Fable; assets by a Sonnet subagent to a written
identity spec; reviewed on Fable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 13:05:24 +01:00

7.8 KiB
Raw Blame History

Overriding Nomarchy's defaults

You consume Nomarchy as a flake input and own two files: system.nix and home.nix. Your config is merged with Nomarchy's modules, so changing a default is just a matter of knowing which of three knobs to reach for. The rule of thumb:

Appearance → the CLI. Behaviour → home.nix. Whole component → toggle it off.

1. Appearance (gaps, colors, rounding, fonts, opacity) — use the CLI

Everything that defines the look flows from state.json, the single source of truth. Change it with nomarchy-state-sync, which writes the JSON and rebuilds — one generation, applied to Hyprland, Waybar, Kitty, btop and Stylix at once:

nomarchy-state-sync set ui.gapsOut 16      # gaps, borders, rounding, opacity
nomarchy-state-sync set ui.rounding 0
nomarchy-state-sync set fonts.mono "FiraCode Nerd Font"
nomarchy-state-sync apply gruvbox          # whole palette

Icon pack

Icons follow the active theme's light/dark mode using Papirus — the only icon pack shipped by default (Papirus alone is ~1 GiB, so extra packs are opt-in rather than a cost every install pays). To switch to another pack:

nomarchy-state-sync set icons "Tela-dark"  # or "" to return to Papirus-by-mode

Only the pack you name is pulled into your system (the first switch downloads it). Known packs and an example theme name from each:

Set icons to… Pack
Papirus, Papirus-Dark, Papirus-Light Papirus (default; "" auto-picks Dark/Light by mode)
Tela, Tela-dark, Tela-<color>[-dark] Tela (colors: blue, green, red, purple, nord, dracula, …)
Qogir, Qogir-Dark, Qogir-Light Qogir (note the capital D/L)
Reversal, Reversal-dark Reversal
Numix-Circle, Numix-Circle-Light Numix Circle

The choice is a sticky global override — it survives apply <palette> switches (presets don't carry an icon field). To add a pack that isn't listed, append a row to iconPacks in modules/home/theme.nix. Set icons to "" any time to drop back to Papirus with automatic Dark/Light.

Auto theme (day/night)

Switch automatically between a light day theme and a dark night theme on a schedule — the same one engine as a manual apply, no second pipeline. Turn it on from Look & Feel Auto theme (SUPER+M): toggle it, pick the day and night themes, and set the sunrise/sunset times. The same from a shell:

nomarchy-state-sync set settings.autoTheme.day summer-day --no-switch
nomarchy-state-sync set settings.autoTheme.night summer-night --no-switch
nomarchy-state-sync set settings.autoTheme.sunset 20:00 --no-switch
nomarchy-state-sync set settings.autoTheme.enable true --no-switch
nomarchy-state-sync auto --force   # one rebuild: installs the timer + applies now

State lives in settings.autoTheme:

Field Meaning
enable on / off
day / night theme slugs (see nomarchy-state-sync list) — the exclusive pairs are made for this: boreal-dawn/boreal, executive-ivory/executive-slate, kiln-clay/kiln, summer-day/summer-night
sunrise / sunset switch times, "HH:MM" (24-hour)

A timer re-checks every ~15 minutes: the day theme applies around sunrise, the night theme around sunset — but it only rebuilds when the active theme actually needs to change, so most checks do nothing. Enabling rebuilds once (to install the timer); disabling is instant. Preview the current decision without switching with nomarchy-state-sync auto --which.

These values are deliberately kept at normal priority in the modules, so they stay owned by the theme system. If you insist on pinning one in home.nix regardless of the active theme, use lib.mkForce (see §4) — but then the CLI can no longer change that knob.

2. Behaviour (input, misc, monitor, animations, terminal chrome) — home.nix

Non-appearance defaults are set with lib.mkDefault, so a plain assignment in your home.nix wins — no mkForce needed:

# home.nix
{ ... }:
{
  wayland.windowManager.hyprland.settings = {
    input.follow_mouse = 0;            # was 1
    input.touchpad.natural_scroll = false;
    misc.disable_splash_rendering = false;
    monitor = [ "DP-1,2560x1440@144,0x0,1" ];   # raw rule — replaces the default
    animations.enabled = false;
  };

  programs.kitty.settings = {
    window_padding_width = 4;          # was 12
  };
}

For monitor layout, prefer the friendlier nomarchy.monitors (a list of per-output submodules — resolution/position/scale/rotation — turned into Hyprland rules and applied on hotplug; run nwg-displays to find the values interactively). Assigning settings.monitor directly, as above, replaces it.

Adding vs. overriding lists

bind, bindel, bindl, bindm and exec-once are lists kept at normal priority, so anything you add concatenates with Nomarchy's — your binds and autostarts run alongside the defaults:

{
  wayland.windowManager.hyprland.settings = {
    bind = [
      "$mod, B, exec, firefox"
      "$mod SHIFT, S, exec, grim -g \"$(slurp)\" - | satty --filename -"
    ];
    exec-once = [ "nm-applet --indicator" ];
  };
}

To remove or replace a default bind, override the whole bind list with lib.mkForce [ … ] (you then own the full list), or rebind the key to something else (last definition for a key wins in Hyprland).

You can also drop raw config that doesn't fit the Nix schema:

{ wayland.windowManager.hyprland.extraConfig = ''
    bindl = , switch:Lid Switch, exec, hyprlock
  '';
}

Waybar

For a themed bar identity, ship whole-swap assets (themes/<slug>/waybar.jsonc and waybar.css) — see the main README. To replace the bar wholesale from home.nix, assign programs.waybar.settings. mainBar / programs.waybar.style (both mkDefault, so a plain assignment wins). For a one-off tweak of a single generated key, lib.mkForce it.

3. Whole component — toggle it off and bring your own

Each desktop piece has an enable flag (all default true). Turn one off and Nomarchy contributes nothing for it, leaving the field clear for your own:

# home.nix
{
  nomarchy.hyprland.enable = false;   # then write your own wayland.windowManager.hyprland
  nomarchy.waybar.enable = false;
  nomarchy.swaync.enable = false;
  nomarchy.idle.enable = false;       # no hyprlock/hypridle
}
# system.nix
{
  nomarchy.system.plymouth.enable = false;
  nomarchy.system.greeter.enable = false;   # bring your own login manager
}

See the option tables in the README for the full list.

4. Last resort: lib.mkForce

To override a value Nomarchy sets at normal priority (an appearance value, or a whole list), raise your definition's priority:

{ lib, ... }:
{
  # hardcode rounding against the theme (the CLI can no longer change it)
  wayland.windowManager.hyprland.settings.decoration.rounding = lib.mkForce 0;

  # own the entire keybind list
  wayland.windowManager.hyprland.settings.bind = lib.mkForce [ "$mod, Return, exec, kitty" ];
}

If a plain assignment errors with "has conflicting definition values", that value is theme-owned at normal priority — either change it via the CLI (§1) or mkForce it here.

Quick reference

You want to… Do this
Change gaps / colors / rounding / fonts nomarchy-state-sync set … or apply
Change input / misc / monitor / animations / terminal chrome plain assignment in home.nix
Arrange monitors declaratively nomarchy.monitors (values via nwg-displays)
Add keybinds / autostarts add to the bind / exec-once list (concatenates)
Replace all keybinds bind = lib.mkForce [ … ]
Hardcode an appearance value against the theme lib.mkForce in home.nix
Drop a whole component nomarchy.<component>.enable = false
Raw Hyprland lines wayland.windowManager.hyprland.extraConfig