Files
Nomarchy/docs/ROADMAP.md
Bernardo Magri 72f7e7b93d docs(roadmap): log Hyprland keymap + waybar-toggle inconsistencies
Two behavioral wrinkles found during the Pillar 8 desktop-stack sweep
that need a design decision before they can be fixed. Logged as Later
rows so the audit doesn't lose them.

1. The Hyprland Wayland keymap is hardcoded to `us` in
   `core/home/config/nomarchy/default/hypr/input.conf:3`, ignoring the
   installer-chosen layout for native Wayland apps. Fix needs either a
   templated input.conf driven by a new home option, or session-level
   `XKB_DEFAULT_LAYOUT` propagation. Either path touches the installer
   heredoc and the home modules, so not a same-PR fix.

2. `nomarchy.toggles.waybar` is exported only as an env var consumed
   by the runtime toggle script. The Nix module always sets
   `programs.waybar.enable = lib.mkDefault true`, so the toggle is
   session-only — waybar comes back on every rebuild/reboot.
   Inconsistent with `toggles.idle` which correctly gates
   `services.hypridle.enable`. Needs a behavioral call (persistent
   gate vs intentional runtime-only with a clearer name).
2026-05-19 20:24:27 +01:00

38 KiB
Raw Blame History

Nomarchy Roadmap

This is the mid-term plan for Nomarchy. It exists so future sessions — human or agent — can pick up work without re-deriving context. Items move from NowNextLater as priorities shift, and from any column into Shipped at the bottom when done. There are no dates: ship-when-ready.

If you're new here, also read docs/STRUCTURE.md and docs/OPTIONS.md. Existing-NixOS users should also read docs/MIGRATION.md.

1. Vision & guardrails

Nomarchy is a NixOS-based distribution that gives you a polished Hyprland desktop (Hyprland + waybar + walker + a curated theming engine) on a strictly declarative, flake-based foundation. Goal: power-user polish without giving up reproducibility.

Guardrails (apply when adding anything):

  • Declarative-first. No imperative state in core/. Anything mutable lives in ~/.config/nomarchy/state.json or in NixOS options.
  • Downstream-flake friendly. Every behavior toggle is a nomarchy.* option documented in docs/OPTIONS.md. Adding a feature without a corresponding option is a bug.
  • Opt-in by default. New features default off (or default to the existing behavior). The installer can flip defaults for the user, but the option must read sensibly when set by hand.
  • Reuse before invent. Before adding a script, grep core/system/scripts/, features/scripts/utils/, and themes/engine/scripts/ — there are ~155 of them, and many of the things you want already exist.

2. Now / Next / Later board

Now (ready to pick up)

  • Full QA audit of shipped features. Walk every feature/component end-to-end on a real install, fix what's small, log what's not. Runs as per-component PR sweeps — methodology in Pillar 8.
  • Installer: "What's installed?" summary on first boot. Surface what the installer actually wrote (theme, font, profiles, drives, form factor) from state.json + nomarchy-system-scripts introspection so the user can verify before they start customising. Detail in Pillar 4.
  • Installer: optional non-LUKS branch. Let users explicitly opt out of FDE during install. Detail in Pillar 4.

Next (bigger lifts that build on Now)

  • Accessibility — home-side companion. Hyprland-side bits the system preset can't reach: slower input.repeat_rate / repeat_delay defaults, SUPER+ALT+S keybinding to launch Orca, and a high-contrast palette under themes/palettes/. Gated on a new nomarchy.accessibility.enable mirror of the system option.
  • Gaming — declarative flathub remote. services.flatpak.enable doesn't ship a declarative remote API in nixpkgs. Either add the flatpak-managed-install overlay, write a one-shot systemd unit that runs flatpak remote-add --if-not-exists flathub …, or surface the manual step in nomarchy-welcome.
  • Plymouth theme variants per palette. Currently one Plymouth theme; could template per-palette so the boot splash matches the active theme.
  • Implement nomarchy.overrides.* file-based override loader. The option surface is declared in core/home/overrides.nix but the loader doesn't exist — files dropped under ~/.config/nomarchy/overrides/ are ignored. Spec: when overrides.enable = true, for each xdg.configFile.<path> Nomarchy deploys with lib.mkDefault, check whether ~/.config/nomarchy/overrides/<path> exists at build time; if so, use it as the source. Requires deciding whether discovery happens at activation time (cheap, but rebuild-required to pick up new files) or via a populated paths attrset (Nix-side, evaluated once per rebuild). Until shipped, document the per-file workaround (xdg.configFile.<path>.source = ./mine) in OPTIONS.md.

Later (speculative or research-shaped)

  • Declarative-state migration. Move the bits of state.json that don't actually need runtime mutability (theme, font, isLightMode) into NixOS / home-manager options, leaving only genuinely runtime-only state behind. Reduces the "two sources of truth" surface.
  • Rolling vs pinned channel choice in the installer. Today the generated flake pins nomarchy to a rev. Offer a "rolling" option that follows main and a nomarchy-rollback helper for stuck rebuilds.
  • Theme creation wizard. A nomarchy-theme-new script that scaffolds a new palette from a base16 hex set (or by sampling a wallpaper), runs nomarchy-themes-prebuild, and opens a PR template.
  • CI matrix on Forgejo Actions. On every push: nix flake check, build nomarchy-installer, nomarchy-live, default. On tag: publish ISOs as release artefacts.
  • Golden-image VM tests per palette. A nixosTest per palette that boots the default config, takes a screenshot, and diffs against a golden image. Catches Stylix regressions before they hit users.
  • Forgejo release pipeline. vYY.MM.x tags matching the upstream NixOS channel; the pipeline pushes the three ISOs and an updated flake.lock snapshot.
  • Optional nomarchy-installer-vm rebuilt as a real flake app (not a one-off shell script) so users can install Nomarchy into a libvirt VM declaratively.
  • Surface support module via the relevant nixos-hardware profile + Surface kernel patches behind a nomarchy.hardware.isSurface toggle.
  • Consolidate palette imports in flake.nix via nomarchyLib. flake.nix:79-80 re-imports ./themes/palettes and recomputes themeNames even though lib/default.nix already exports both. Two computations, same result today — drift risk tomorrow. Import nomarchyLib = import ./lib { inherit lib; } once and use nomarchyLib.{palettes,themeNames} to make lib/default.nix the single source of truth for the theme list.
  • Decide what to do about features/apps/chromium/Default/Preferences. The module deploys a static 204-byte Default/Preferences (setting extensions.theme.use_system = false, browser.theme.color_scheme = 2) into chromium's mutable profile directory via Home Manager symlink. Chromium expects to write that file at runtime, so either the symlink is silently replaced on first save (losing the static defaults) or the write fails silently. The real chromium theming work happens via managed policies in core/system/browser.nix. Probably the user-profile deployment should be removed; needs someone with chromium-internals knowledge to confirm before deletion.
  • themes/templates/*.tpl — decide what these are for. Eleven mustache-style templates (alacritty.toml.tpl, btop.theme.tpl, kitty.conf.tpl, etc.) are deployed to ~/.local/share/nomarchy/templates/ via themes/engine/files.nix, but no script in the tree consumes them. Likely vestigial from a pre-stylix templating system. Either delete the directory + the xdg.dataFile deployment, or document them as user-reference assets and explain how to use them.
  • Move programs.uwsm Hyprland session out of core/system/virtualization.nix. Session-manager config is wired in the virtualization module by historical accident — it's loaded unconditionally on every install and has nothing to do with libvirt/docker. Move to a dedicated core/system/session.nix (or fold into the Hyprland feature module) so the location matches the responsibility.
  • Route installer keymap into Hyprland's Wayland session. core/home/config/nomarchy/default/hypr/input.conf:3 hardcodes kb_layout = us. The installer writes services.xserver.xkb.layout = "$KEYMAP_LAYOUT" (and console.keyMap), but Hyprland reads its own input config on native Wayland, so a non-US user's chosen layout works in XWayland apps and the TTY console but not in native Wayland apps — surprising and inconsistent. Fix paths: (a) template input.conf from a new nomarchy.keymap.{layout,variant} home option that the installer writes alongside formFactor, or (b) propagate XKB_DEFAULT_LAYOUT via session env so Hyprland's fallback kicks in. Option (a) is the durable fix; needs the installer's heredoc to add the option write.
  • Make nomarchy.toggles.waybar a Nix-level gate, or document it as runtime-only. Today the toggle is exported as NOMARCHY_TOGGLE_WAYBAR env, consumed only by nomarchy-toggle-waybar (which pkill/exec's at runtime). The Nix module always sets programs.waybar.enable = lib.mkDefault true, so waybar comes back on every rebuild/reboot regardless of the toggle. Inconsistent with toggles.idle, which correctly gates services.hypridle.enable. Either gate programs.waybar.enable on the toggle (persistent) or rename the option to make its session-only nature obvious.

3. Pillar: Script & menu audit

Nomarchy ships ~155 nomarchy-* scripts across three directories, plus a 379-line nomarchy-menu with 23 submenu functions. Some are first-class Nomarchy work; some are direct Omarchy ports that haven't been adapted; some are dangling references the menu calls but no script implements (e.g. nomarchy-backup, nomarchy-debug, nomarchy-pkg, nomarchy-pkg-aur-add, nomarchy-plymouth, nomarchy-refresh-hyprland, nomarchy-reinstall, nomarchy-rollback, nomarchy-screenrecord-filename, nomarchy-theme, nomarchy-update-firmware, nomarchy-upload-log, nomarchy-version, nomarchy-wallpaper, nomarchy-skill, nomarchy-luks).

This pillar fixes that. It runs as two phases.

Phase A — Inventory & triage

Lands as a single PR. Output is docs/SCRIPTS.md populated with rows for every script and every menu item.

  1. Run a generator (one-shot helper, doesn't have to be checked in) that produces three lists:
    • All nomarchy-* scripts under core/system/scripts/, features/scripts/utils/, themes/engine/scripts/.
    • All nomarchy-* callers (grep core/, features/, themes/, installer/, bin/).
    • The set difference (orphaned callers ↔ unreferenced scripts).
  2. Walk features/scripts/utils/nomarchy-menu and list every menu entry with its target script.
  3. Tag each row with a status:
    • kept — works on Nomarchy, no change needed.
    • port-from-omarchy — exists upstream, needs adapting (drop pacman/yay/AUR, repath to NixOS, talk to nomarchy.system.* options).
    • delete-dead — neither used nor needed; remove and update callers.
    • stub-with-notify — temporarily replace with a notify-send "Not yet implemented in Nomarchy" so the menu stops looking broken until the work is scheduled.
    • unknown — needs a deeper look before tagging.
  4. The completed table lives at docs/SCRIPTS.md. The roadmap links to it; this section just sets the methodology.

Phase B — Adapt or remove

Lands as PR batches of ~10 scripts each, branch named wave/audit-<batch>. Per script:

  • For port-from-omarchy: rewrite the script for Nomarchy paths (/etc/nixos, nixos-rebuild, home-manager, no Arch idioms), wire it into nomarchy.system.* where applicable, and update every caller (menu, waybar, keybindings).
  • For delete-dead: git rm the script and fix every caller — a find + sed pass against nomarchy-menu, every *.conf, and every nix file.
  • For stub-with-notify: write the one-liner stub in place. The roadmap row stays open until the real implementation lands.

Each PR description should reference the row(s) in docs/SCRIPTS.md it closes, and reviewers spot-check that no caller still points at a stale name.

4. Pillar: Installer

  • "What's installed?" summary screen on boot of a freshly-installed system, sourced from state.json + nomarchy-system-scripts introspection (Now).
  • Optional non-LUKS branch in the installer for users who explicitly opt out of FDE (Now).
  • Richer disk metadata (Shipped).
  • disko-golden.nix variants for software-RAID and BTRFS-pool-as-root (Shipped).
  • Pre-flight resume polish (Shipped).
  • Software-profile multi-select (Shipped).
  • Form-factor → laptop preset (Shipped).

5. Pillar: Power, hardware, presets

  • Auto-detect dGPU presence in installer/hardware-db.sh and pre-fill hardware.nvidia.prime.{intel,nvidia}BusId in the generated system.nix (driver stack itself is Shipped — see entry below).
  • Surface support behind nomarchy.hardware.isSurface (Later).
  • Laptop preset: TLP, upower, brightness, lid, hypridle tuning (Shipped).
  • Desktop preset: performance governor, no laptop UI (already filtered), ZFS hooks (Shipped).
  • Accessibility preset (Shipped).
  • Gaming preset (Shipped).
  • Vendor matchers in installer/hardware-db.sh (Shipped — ROG Ally added; Surface/Framework/Lenovo entries corrected; Steam Deck + Snapdragon X documented as nixos-hardware-unsupported. CI now lints DB references).

6. Pillar: Onboarding & docs

  • nomarchy-welcome first-run wizard (Shipped).
  • docs/KEYBINDINGS.md auto-generator (Shipped).
  • docs/TROUBLESHOOTING.md (Shipped).
  • docs/index.md / README docs index (Shipped — README.md links every doc in docs/).
  • nomarchy-manual — opens the local ~/.local/share/nomarchy/README.md via xdg-open (Shipped).

7. Pillar: Test, CI, release

  • Forgejo Actions workflow:
    • on every push to main: nix flake check (≈ what we run by hand today).
    • on every PR: also build all three ISOs (cache hit on most of them).
    • on tag vYY.MM.x: publish ISOs as release artefacts.
  • Versioning scheme: vYY.MM.x matching the upstream NixOS channel (e.g. v25.11.3).
  • nixosTest per palette: boots default in a VM, screenshots the SDDM splash and the Hyprland desktop, diffs vs golden. Failure surfaces as CI red.
  • A small bin/utils/nomarchy-bench-iso-build that records ISO build time + size into a per-commit JSON so we notice regressions.

8. Pillar: QA audit — features & components

Nomarchy now spans an installer, ~159 nomarchy-* scripts, a Hyprland desktop stack (Hyprland + waybar + walker + nightlight + idle), curated apps, a 22-palette theme engine, and two ISO hosts. Pillar 3 audited script existence; this pillar audits feature behavior. The goal: walk every shipped feature end-to-end on a real install, fix every bug or surprise inline when small, and capture the rest as new roadmap rows.

Runs as per-component sweeps. One PR per component, branch wave/qa-<component>. Don't grow scope mid-PR — bugs that need a new option, refactor, or missing module become a new Now/Next row.

Components (each is one sweep):

  1. Installerinstaller/install.sh, installer/hardware-db.sh, disko configs. Fresh install + --resume + --dry-run, on laptop and desktop, with FDE (non-LUKS branch is Later). Verify every generated file (flake.nix, system.nix, home.nix, hardware-selection.nix, state.json) is correct and idempotent.
  2. First-boot UXnomarchy-welcome, generated home.nix, SDDM and Plymouth metadata, default theme/font/panel position. Re-run on a clean VM; note every prompt that confuses and every default that's wrong.
  3. Core system modulescore/system/* (laptop, desktop, accessibility, gaming, hybridGPU, impermanence, network, hardware, branding). For each: enable → rebuild → observe the claimed effect → disable → rebuild → observe it's gone. Cross-check against docs/OPTIONS.md.
  4. Core home modulescore/home/* (options, state, behavior, overrides, deployed config). Verify every home-side nomarchy.* option does what its description claims; confirm ~/.config/nomarchy/overrides/ actually overrides.
  5. Desktop stack — Hyprland (keybindings, window rules, monitors, input), waybar (every module × both panel positions × both form factors), walker (every launcher mode), idle, nightlight, notifications (mako). Reconcile docs/KEYBINDINGS.md against runtime.
  6. Appsfeatures/apps/*. Each app: launches, themed via Stylix, configured as expected. Catches the "we package it but nobody configured it" class.
  7. Theme engine + palettesnomarchy-theme-set across all 22 palettes, font and wallpaper switchers, light-mode toggle. Verify per-palette Stylix targets render correctly across SDDM, Plymouth, GTK, Qt, terminals, browsers, waybar, walker.
  8. Scripts (runtime behavior) — Pillar 3 confirmed existence; this sweep runs every user-visible script (especially every nomarchy-menu entry) on current NixOS and confirms it actually does the thing.
  9. ISOs — boot nomarchy-installer and nomarchy-live; verify the nomarchy-test-live-iso flow; check the installer ISO ships every tool install.sh calls (regression class: hardware-db.sh missing, already shipped).
  10. Lib + state schemalib/state-schema.nix, color resolution, path helpers. Cross every codepath that produces state.json (installer, welcome wizard, hand-edit) against the schema; confirm bad inputs are rejected with a useful message.

Per-PR deliverable:

  • PR body lists what was tested, what was broken, what was fixed inline, what was deferred (with the new roadmap row linked).
  • Doc updates ride with the change per docs/AGENT.md §5.4.
  • Don't bundle fixes across components — keep one component per branch so reviewers can spot-check end-to-end without context-switching.

Pillar is done when every component has a closed wave/qa-<component> PR and the roadmap captures every deferred finding.

9. Process notes

  • Branch naming: wave/<pillar>-<short-slug>. Examples: wave/audit-pkg-scripts, wave/installer-disk-metadata, wave/laptop-preset.
  • One PR per audit batch. Reference rows in docs/SCRIPTS.md. Smaller PRs review faster.
  • Living roadmap. When an item ships, move it to the Shipped section at the bottom of this file rather than deleting it. Future-us gets a free changelog.
  • Plan files live separately. Detailed implementation plans (the per-feature design docs Claude writes in plan mode) belong under ~/.claude/plans/ per session, not in the repo. The roadmap is the durable reference; plan files are working notes.
  • Don't widen scope mid-PR. If the audit reveals a missing feature, file a new roadmap row, don't graft it onto the current PR.

Shipped

(Move items here when they land — keep them brief, link the commit/PR.)

  • 2026-05-18 — Hardware DB correctness pass + ROG Ally support + CI lint. Audited every nomarchy-hardware-db entry against inputs.nixos-hardware.nixosModules and found 21 of 43 entries (49%) referenced modules that don't existmicrosoft-surface-pro-8, lenovo-thinkpad-x1-carbon-gen11, framework-13-11th-gen-intel, etc. were all eval-time failures waiting for a real user. Rewrote the DB to use only valid module names: Framework gens dropped the "13-" prefix in nixos-hardware (framework-11th-gen-intel, not framework-13-11th-gen-intel); ThinkPad X1 modules are x1-Nth-gen, not x1-carbon-genN; Surface Pro 6/7/8/10 all share microsoft-surface-pro-intel; Surface Book / Intel Surface Laptop have no module (rows dropped, generic detection still emits sensible common-pc-laptop + cpu/gpu). Added matchers for ROG Ally (RC71L / RC72LA / "ROG Ally" via asus-ally-rc71l). Documented Steam Deck and Snapdragon X as nixos-hardware-unsupported in a footer comment (Steam Deck → Jovian-NixOS; Snapdragon X → installer is x86_64 only). Added a CI step (.forgejo/workflows/check.yml) that fails on any DB entry whose module name isn't in nixos-hardware.nixosModules — closes this regression class.
  • 2026-05-18nomarchy-manual re-targeted at local docs. The script's xdg-open previously pointed at https://learn.omacom.io/2/the-nomarchy-manual — an upstream Omarchy URL that opened an unrelated page when users hit the menu's Help entry. Now opens ~/.local/share/nomarchy/README.md (the local docs index per SKILL.md's "Out of Scope" note), with a notify-send fallback if the source tree isn't synced.
  • 2026-05-18 — Docs hygiene: STRUCTURE.md "Root Directory" + Pillar 6 reality-check. docs/STRUCTURE.md listed three top-level files that don't exist (GEMINI.md, root-level STRUCTURE.md, TODO.md) — replaced with an accurate root listing plus a docs/ sub-tree that names every doc. Pillar 6 in this file had nomarchy-welcome, docs/TROUBLESHOOTING.md, and the "docs index" bullet still marked Next despite all three shipping on 2026-04-26 — moved to (Shipped). nomarchy-manual bullet's "orphaned reference today" claim was stale (the script is called from nomarchy-menu and nomarchy-theme-install); rewritten to reflect the real remaining issue — its hardcoded xdg-open https://learn.omacom.io/2/the-nomarchy-manual is an Omarchy URL.
  • 2026-05-18 — Installer state.json is now schema-driven. Replaced the heredoc in installer/install.sh that hardcoded the JSON literal (theme/dns/wifi/features/etc.) with a nix eval of lib/state-schema.nix's system block, overlaid with the installer-chosen timezone. Closes the last source-of-truth split after the centralization batch — adding a new default in the schema now reaches the installer with no further plumbing. Output is identical modulo alphabetical key ordering (Nix's builtins.toJSON sorts keys; toggle scripts read/write via jq so it's invisible to them). Dry-run path unchanged (still bind-mounts a fake /mnt so the generator's absolute paths resolve correctly). bash -n + shellcheck --severity=error clean.
  • 2026-05-18 — Complete the hybrid-GPU wiring + fix unoverridable state-derived options. Two related fixes shipped together. (1) nomarchy.system.features.hybridGPU = true now wires the full NVIDIA driver stack (services.xserver.videoDrivers = ["nvidia"], hardware.graphics.{enable,enable32Bit}, hardware.nvidia.{modesetting,powerManagement}.enable, package = nvidiaPackages.stable, boot.kernelParams += "nvidia-drm.modeset=1") — was previously enabling only supergfxd mode-switching while leaving the system with no NVIDIA driver loaded, so mode switches silently no-op'd. All knobs use lib.mkDefault so a downstream system.nix can pin a beta driver, flip to the open kernel module, etc. Bus-ID prime config (per-machine) stays user-supplied — docs/OPTIONS.md has the full recipe. (2) Both core/system/state.nix and core/home/state.nix now use lib.mkDefault on every state.json-derived assignment, fixing a class of "I set X in my system.nix but it doesn't take effect" bugs (the state-derived value was at default priority and conflicted with the user's same-priority override). Side-effect cleanup: core/system/state.nix now also reads from lib/state-schema.nix like core/home/state.nix does, completing the schema-centralization started two batches ago. Verified nix flake check + an override test that flips hybridGPU via an overlay and confirms the entire driver stack engages.
  • 2026-05-18 — Pillar 4: pre-flight resume polish. Fixed four resume-flow gaps in installer/install.sh: (1) --resume with a missing state file now errors loudly with a tmpfs explanation instead of silently falling through to a fresh prompt cycle (the most common operator confusion was "rebooted, forgot tmpfs eats /tmp/, watched the installer start over without realising"); (2) on resume, the saved target drive is validated as a block device before any disk-phase step runs — catches the live-ISO USB-unplugged / non-deterministic /dev/sdX class of mid-install failures; (3) save_state now stamps an ISO-8601 timestamp and load_state shows a (saved Xm ago) banner plus a Target: /dev/X → user @ host summary line, so the user can Ctrl-C if they're resuming onto the wrong host before any destructive prompt fires; (4) --help now documents the tmpfs limitation. shellcheck --severity=error passes.
  • 2026-05-18 — Declarative-state defaults centralization. Made lib/state-schema.nix the single source of truth for every state-default that previously lived in three places (the schema itself, core/system/options.nix / core/home/options.nix default = … clauses, and core/home/state.nix or … fallbacks). Replaced ~25 hardcoded literals with schema.<scope>.<key> reads. Side-effect: fixed a lingering bug where core/home/options.nix:theme still defaulted to "summer-night" after the system-side was moved to "nord" — half the codebase's home option resolved to the wrong theme when state.json was missing/blank. nix flake check --no-build confirms zero semantic change for every other field. Doesn't touch the installer-written state.json (separate batch — needs schema → JSON generation).
  • 2026-05-18 — Pillar 7 first step: Forgejo Actions CI (eval + lint). New .forgejo/workflows/check.yml runs on every push to main and every PR: (1) nix flake check --no-build to catch eval regressions, (2) bash -n + shellcheck --severity=error over every nomarchy-* bash script (whole-tree, not just changed files — gates branches that bypass the pre-commit hook), (3) docs/SCRIPTS.md drift check (fails loudly if a script change didn't regenerate the audit doc). All three checks pass locally on the current tree. Activation requires enabling Actions on the Forgejo repo and registering a forgejo-runner; the workflow itself is dormant until then. ISO build job is intentionally deferred — needs a binary cache (Cachix/Attic) to be tractable.
  • 2026-05-18Pillar 3 Phase B: complete. Final batch (restart/sudo/theme/misc clusters) cleared the last 13 unused? rows. Deleted five truly dead scripts: nomarchy-restart-{hyprctl,mako} (theme switching calls hyprctl reload/makoctl reload directly now), nomarchy-restart-tmux (one-liner of marginal value), nomarchy-battery-present (battery monitor checks /sys/class/power_supply/BAT* inline), nomarchy-sudo-keepalive (intended-to-be-sourced building block with no users). Surfaced eight useful tools in SKILL.md so the audit catches them as kept and AI assistants can discover them: nomarchy-restart-trackpad (intel_quicki2c reload), nomarchy-sudo-{passwordless-toggle,reset}, nomarchy-theme-{bg-install,refresh,remove}, nomarchy-refresh-fastfetch, nomarchy-windows-vm (new Virtualization section). Final state: 159 scripts, all kept, unused? = 0, missing references = 0.
  • 2026-05-18 — Pillar 3 Phase B: webapp/tui/voxtype install-remove pair triage. Deleted two dead webapp URI handlers (nomarchy-webapp-handler-hey, nomarchy-webapp-handler-zoom) — no .desktop MimeType registration anywhere routed mailto:/zoom: URIs to them, so the handlers could never fire. Surfaced six useful CLI tools in SKILL.md "Common Tasks" so they're discoverable by AI assistants and tagged kept by the audit: nomarchy-webapp-{remove,remove-all}, nomarchy-tui-{remove,remove-all}, nomarchy-voxtype-{install,remove}. Script count 166 → 164; unused? 21 → 13.
  • 2026-05-18 — Pillar 3 Phase B: dead-code sweep (NixOS-irrelevant Omarchy ports). Deleted five scripts that duplicated NixOS-native facilities or referenced infrastructure Nomarchy doesn't ship: nomarchy-rollback (boot-menu generations + nixos-rebuild rollback already cover this), nomarchy-snapshot (used snapper; impermanence and BTRFS subvolumes are the Nomarchy answer), nomarchy-migrate-state (one-shot pre-unification migration, no current callers), nomarchy-config-direct-boot (added an EFI entry for a UKI we never build), and nomarchy-npx-install (Arch idiom — nix-shell -p nodejs is the NixOS path). Kept nomarchy-build-iso and nomarchy-build-live-iso and surfaced them in README §2 so the audit tags them kept. Script count 171 → 166.
  • 2026-05-18 — Pillar 3 Phase B: missing-references triage. (1) Wrote themes/engine/scripts/nomarchy-theme-next so SKILL.md's documented "cycle to next theme" command resolves; (2) scrubbed three stale nomarchy-dev-* references from core/home/config/nomarchy-skill/SKILL.md; (3) added a line-context filter to both nomarchy-docs-scripts generators that drops nomarchy-* tokens appearing in Nix pname/derivation idents, /tmp/ & /etc/sudoers.d/ paths, nixosConfigurations.* / packages.* flake outputs, mktemp -t prefixes, systemd unit vars, ./result/bin/run- binaries, and docker container references; (4) added a small token-level denylist for five residual non-script identifiers (nomarchy-plymouth, nomarchy-sddm-theme, nomarchy-live, nomarchy-rev, nomarchy-windows) that survive line filtering. docs/SCRIPTS.md "Missing references" section is now empty (was 15).
  • 2026-05-04 — Pillar 8: Distro Branding. (1) Scrubbed remaining "Omarchy" and "Spirit of Omarchy" references from README, scripts, and welcome wizard; (2) Updated nomarchy-welcome banner and nomarchy-version codename ("Sovereign"); (3) Verified existing core/system/branding.nix handles OS-release and bootloader labels; (4) Confirmed SDDM and Plymouth metadata are already Nomarchy-branded.
  • 2026-05-04 — Thorough Out-of-the-Box QA Audit. (1) Restored automatic wallpaper switching by removing image filters from deployed themes; (2) Fixed broken "Style" menu entries by creating missing about.txt and screensaver.txt branding files; (3) Cleaned up conflicting keybindings by removing deprecated tiling.conf and updating the doc generator; (4) Removed legacy Nord theme hack from nomarchy-theme-set; (5) Fixed JSON parse error in summer-day waybar theme.
  • 2026-05-03 — Fixed multi-disk LUKS/BTRFS boot hang. (1) Moved temporary LUKS keyfile to /tmp/ so Disko correctly omits it from the runtime configuration; (2) Injected x-systemd.requires and x-systemd.device-timeout=0 into BTRFS mount options to ensure all LUKS drives are decrypted before mounting.
  • 2026-05-03 — Fixed CLI wrappers and removed obsolete code. (1) Updated nomarchy-font, nomarchy-theme, and nomarchy-wallpaper CLI wrappers to use modern Walker menus; (2) Removed the obsolete and broken themes/engine/switcher.nix and its associated Nix-inlined scripts; (3) Cleaned up remaining $NOMARCHY_PATH references from the Omarchy era.
  • 2026-05-03 — Fixed /etc/nixos ownership after installation. Added a chown -R $USERNAME:users /etc/nixos step via nixos-enter at the end of installer/install.sh so the main user owns their configuration and can run home-manager commands without sudo.
  • 2026-05-01 — Installer & Script Audit Polish. (1) Fixed a critical bash dynamic scoping bug in installer/install.sh where rc=0 assignments inside functions (Impermanence, Form Factor) were clobbering the main loop's return code, causing the installer to abort when "No" was selected; (2) Polished hosts/nomarchy-live.nix with auto-login for the nixos user and passwordless sudo for the wheel group; (3) Repurposed nomarchy-toggle-suspend to execute systemctl suspend directly and updated nomarchy-menu to reflect this; (4) Updated nomarchy-launch-wifi to use nmtui in Alacritty; (5) Regenerated docs/SCRIPTS.md to reflect the updated script mappings.
  • 2026-04-30set -e sweep across nomarchy-* scripts. Added set -e to 142 of 169 bash scripts that lacked it (27 already had it). Halts a class of "command failed silently in the middle of a chain, system left in half-applied state" bugs that produced repeat-fix commits. One deliberate exception: nomarchy-menu runs without set -e because it's an interactive UX loop where action failures should re-display the menu rather than abort the script. Pre-commit hook now enforces bash -n + shellcheck --severity=error so future scripts can't regress this.
  • 2026-04-30 — Installer disk-phase reliability. Hardened installer/install.sh and consolidated the disko configs: (1) select_disk now hides the live-ISO boot device(s) so the installer can't format its own boot media (NOMARCHY_INSTALL_ALLOW_ISO_TARGET=1 to override); (2) added a 10 GiB minimum-capacity preflight; (3) prewipe_target_drive enumerates every active dm-crypt mapping backed by the target drive and closes them, drops the silent || true from wipefs/sgdisk/dd, bounds udevadm settle to 30s, and refuses to continue if anything is still mounted; (4) wrapped the disko call in run_disko_with_retry with last-30-lines + Retry / View full log / Abort dialog on failure; (5) replaced the sed-templated disko-golden.nix + disko-btrfs-multi.nix pair with a single disko-config.nix Nix function called via --argstr mainDrive … --arg extraDrives '[…]' — eliminates a class of escaping bugs (cf. 3aadc36); (6) added an EXIT trap so the tmpfs LUKS key file is removed even on early abort.
  • 2026-04-30 — Gaming home-side companion. New nomarchy.gaming.enable option (mirror of nomarchy.system.gaming.enable) and core/home/gaming.nix module that injects a Hyprland windowrulev2 = fullscreen, class:^(steam_app_).*$ so Steam-launched games grab the whole screen. Closes the "Gaming — Hyprland window rule" Next-column row.
  • 2026-04-26 — Default to highest resolution (highres) for monitors. Updated features/desktop/hyprland/config/monitors.conf and forced it in the live ISO (nomarchy-live) to resolve issues where some hardware would default to a low resolution (1024x768).
  • 2026-04-26 — First-run welcome wizard (nomarchy-welcome). Extended from a one-shot greeter into a guided picker for theme, font, and panel position. Added Step 4 to generate a starter home.nix if missing. State is now persisted in state.json via .welcome_done. Added nomarchy.panelPosition option to Waybar.
  • 2026-04-26 — Multi-disk BTRFS support in the installer. Added installer/disko-btrfs-multi.nix template and updated installer/install.sh to allow selecting multiple drives via gum choose --no-limit. Implements BTRFS "single" data + RAID1 metadata across multiple LUKS-encrypted drives.
  • 2026-04-26 — Distro Branding Phase 2. Updated bootloader entries to use "Nomarchy" as the label. Set ISO volume IDs to NOMARCHY_INSTALLER and NOMARCHY_LIVE. Fixed branding in Plymouth theme metadata and SDDM metadata.
  • 2026-04-26 — Distro Branding Phase 1. Renamed installerIso to nomarchy-installer and installerIsoGraphical to nomarchy-live. Updated metadata and host configurations. Scrubbed "Omarchy" from Plymouth and installer messages.
  • 2026-04-26 — Fix hardware-db.sh missing in nomarchy-installer.nix. Resolved boot error where install.sh failed to source the hardware database on the TTY installer ISO.
  • 2026-04-26 — Installer review-then-edit flow (installer/install.sh). Review screen now offers Continue / Edit a field / Abort. Edit opens a multi-select of saved fields; chosen fields clear and the next loop iteration re-prompts only those. Benefits both fresh installs (typo fixes without abort+restart) and --resume (lands on review immediately, since the loaded vars short-circuit each prompt). LUKS passphrase is held in memory across loop iterations so re-edits don't re-ask for it.
  • 2026-04-26docs/TROUBLESHOOTING.md. The five most common rebuild errors (option-already-declared, attribute-missing, Stylix target conflict, home-manager .hm-bak churn, impermanence path missing) with copy-paste fixes. Linked from README.md and docs/MIGRATION.md.
  • 2026-04-26 — Gaming preset module (core/system/gaming.nix). Opt-in nomarchy.system.gaming.enable (default false). Wires programs.steam (with remotePlay/localNetworkGameTransfers firewall holes via mkDefault), programs.gamemode, and services.flatpak. Flathub remote and Hyprland window-rule split into separate Next-column rows.
  • 2026-04-26 — Accessibility preset module (core/system/accessibility.nix). New nomarchy.system.accessibility.{enable,cursorSize} options (opt-in, default off — accessibility isn't a hardware-derived signal). Enables services.gnome.at-spi2-core, installs Orca, and sets XCURSOR_SIZE=32 (configurable). Hyprland-side companion (key-repeat slowdown, Orca keybinding, high-contrast palette) split into a new Next-column row.
  • 2026-04-26 — Desktop preset module (core/system/desktop.nix). New nomarchy.system.desktop.enable option; defaults to formFactor == "desktop" (mirror of the laptop preset's auto-enable). Pins powerManagement.cpuFreqGovernor to "performance" and enables services.zfs.{autoScrub,trim} so a future ZFS pool gets sensible maintenance for free.
  • 2026-04-26 — Laptop preset module (core/system/laptop.nix). New nomarchy.system.laptop.{enable,thermald} options; enable defaults to formFactor == "laptop" so the installer's existing formFactor write auto-flips it on. Wires TLP (governors + 75/80 charge thresholds), force-disables power-profiles-daemon, enables upower and thermald (x86_64), adds the brightnessctl udev rule for backlight without root, and sets a logind lid-switch policy that defers to hibernation.enable. Closes both the Now item and the largest Next item.
  • 2026-04-25 — Software-profile multi-select in the installer. Users can now pick Dev, Gaming, Office, Media, and CLI Utils profiles during install; logic emits corresponding home.packages and system toggles into the generated config.
  • 2026-04-25 — Pillar 3 Phase B: script & menu audit. Ported/implemented/stubbed ~40 scripts including nomarchy-version, nomarchy-debug, nomarchy-reinstall, nomarchy-rollback, nomarchy-update-firmware, nomarchy-pkg-*, and nomarchy-theme-* wrappers. Moved desktop scripts to packaged utility directory.
  • 2026-04-25 — Docker & fwupd support. Added nomarchy.system.virtualization.docker.enable and nomarchy.hardware.fwupd options. Wires system services and adds docker-compose and fwupdmgr to PATH.
  • 2026-04-25 — Installer VM testing. Added installerVm to flake nixosConfigurations, packages, and apps. nomarchy-test-installer now uses nix run .#installerVm.
  • 2026-04-25docs/KEYBINDINGS.md auto-generator. New repo-tooling script bin/utils/nomarchy-docs-keybindings parses every bindd = / bindeld = line into a Markdown doc; README's keybinding table slimmed to highlights + link.
  • 2026-04-25 — Installer disk picker shows NAME / SIZE / TYPE / VENDOR / MODEL / SERIAL columns instead of bare lsblk. Type derived from ROTA + TRAN (NVMe / USB / SSD / HDD). Filters loop, ram, zram, sr.
  • 2026-04-25 — Pillar 3 Phase A: script & menu audit. New bin/utils/nomarchy-docs-scripts generator produces docs/SCRIPTS.md with 136 scripts and the menu walk pre-tagged via heuristics (kept / unused? / missing). Phase B (per-batch porting / removal) opens.
  • 2026-04-25 — Installer prompts for keyboard layout + locale, applies live; new nomarchy.{system,}.formFactor option; waybar drops battery widget on desktop; nm-applet visibility fix in default theme; live-ISO baseline keymap/locale (a7e7fa9).
  • 2026-04-25docs/OPTIONS.md reference; docs/MIGRATION.md linked from README.md (3cb012b, 6ef28f0).