Before this fix, only the 6 palettes whose theme extensions ship in
pkgs.vscode-extensions had working VSCode theming. Every other palette
had `workbench.colorTheme` set to a name VSCode couldn't find, so it
silently fell back to its built-in default. Including the DEFAULT
summer-night palette (sainnhe.everforest) — the default install had
broken VSCode theming.
Probed the 13 unique extensions against the VSCode marketplace
extensionquery API:
- 10 exist and are pinnable: sainnhe.everforest,
shadesOfBuntu.flexoki-light, qufiwefefwoyn.kanagawa,
oldjobobo.{lumon,miasma,retro-82}-theme, TahaYVR.matteblack,
jovejonovski.ocean-green, monokai.theme-monokai-pro-vscode,
Bjarne.white-theme.
- 3 don't exist on the marketplace and are unpublished custom
Nomarchy themes: Bjarne.{ethereal,hackerman,vantablack}-nomarchy.
Logged as a new Later row.
For the 10, fetched version + sha256 via:
URL='https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage'
nix store prefetch-file --hash-type sha256 "$URL"
Added a marketplaceExtensions list to features/apps/vscode.nix that
wraps each in pkgs.vscode-utils.extensionFromVscodeMarketplace and
concatenates with the existing nixpkgs-packaged list — so 10 more
palettes (including the default) now get correct VSCode theming on
first launch. Smoke-built sainnhe.everforest end-to-end. Module
comment documents the version-bump procedure.
docs/OPTIONS.md updated: the nomarchy.vscode.devExtensions entry
drops the "still break" caveat for everything except the three
unpublished Bjarne palettes.
`nix flake check --no-build` clean.
61 KiB
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 Now → Next → Later 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.jsonor in NixOS options. - Downstream-flake friendly. Every behavior toggle is a
nomarchy.*option documented indocs/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/, andthemes/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)
- Pillar 8 runtime verification pass. Every Component 1–10 code sweep has shipped, but each closeout entry flagged behaviour that can only be confirmed on a real install: boot the live ISO and eyeball waybar across panel positions × form factors × all 22 palettes; run every
nomarchy-menuentry and confirm it does the thing; walk everynomarchy.*option's enable→rebuild→observe loop. Run the punch-list, fix any new bugs inline, log structural ones as new roadmap rows.
Next (bigger lifts that build on Now)
(empty — all entries shipped or moved to Later)
Later (speculative or research-shaped)
- Declarative-state migration. Move the bits of
state.jsonthat 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
nomarchyto a rev. Offer a "rolling" option that followsmainand anomarchy-rollbackhelper for stuck rebuilds. - Theme creation wizard. A
nomarchy-theme-newscript that scaffolds a new palette from a base16 hex set (or by sampling a wallpaper), runsnomarchy-themes-prebuild, and opens a PR template. - CI matrix on Forgejo Actions. On every push:
nix flake check, buildnomarchy-installer,nomarchy-live,default. On tag: publish ISOs as release artefacts. - Golden-image VM tests per palette. A
nixosTestper palette that boots thedefaultconfig, takes a screenshot, and diffs against a golden image. Catches Stylix regressions before they hit users. - Forgejo release pipeline.
vYY.MM.xtags matching the upstream NixOS channel; the pipeline pushes the three ISOs and an updatedflake.locksnapshot. - Optional
nomarchy-installer-vmrebuilt 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-hardwareprofile + Surface kernel patches behind anomarchy.hardware.isSurfacetoggle. - High-contrast accessibility palette. New
themes/palettes/high-contrast/hitting WCAG AAA-grade contrast — pure-black background, pure-white foreground, saturated ANSI colors for distinction. Ships its owncolors.toml,icons.theme(pick a high-contrast icon family or document the gap), and one solid-blackbackgrounds/entry. Pairs withnomarchy.accessibility.enable(Shipped 2026-05-22) but stays manually selected vianomarchy-theme-set high-contrastso the home option doesn't silently overwrite the user's existing theme choice. Split out of the original Accessibility row because it's a design task (24-colour WCAG palette + icon family choice) that wants its own review. - Publish or replace
Bjarne.{ethereal,hackerman,vantablack}-nomarchyVSCode theme extensions. Theethereal,hackerman, andvantablackpalettes'apps/vscode.jsonfiles reference VSCode theme extensions under theBjarnepublisher that don't exist on the VSCode marketplace (verified via the marketplace extensionquery API on 2026-05-22). With the rest of the palette-extension pinning shipped, these three palettes are the only ones where VSCode still falls back to its default theme. Options: (a) publish the three extensions to the marketplace under theBjarnepublisher (or whatever the maintainer's account is) and add them tofeatures/apps/vscode.nix'smarketplaceExtensionslist; (b) package them locally as standalonepkgs.vscode-utils.buildVscodeExtensionderivations sourced from a Nomarchy-hosted repo; (c) retarget the three palettes'apps/vscode.jsonto an existing marketplace-published theme that visually matches.
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.
- Run a generator (one-shot helper, doesn't have to be checked in) that produces three lists:
- All
nomarchy-*scripts undercore/system/scripts/,features/scripts/utils/,themes/engine/scripts/. - All
nomarchy-*callers (grepcore/,features/,themes/,installer/,bin/). - The set difference (orphaned callers ↔ unreferenced scripts).
- All
- Walk
features/scripts/utils/nomarchy-menuand list every menu entry with its target script. - 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 tonomarchy.system.*options).delete-dead— neither used nor needed; remove and update callers.stub-with-notify— temporarily replace with anotify-send "Not yet implemented in Nomarchy"so the menu stops looking broken until the work is scheduled.unknown— needs a deeper look before tagging.
- 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 intonomarchy.system.*where applicable, and update every caller (menu, waybar, keybindings). - For
delete-dead:git rmthe script and fix every caller — afind+sedpass againstnomarchy-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-scriptsintrospection (Shipped). - Richer disk metadata (Shipped).
disko-golden.nixvariants 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.shand pre-fillhardware.nvidia.prime.{intel,nvidia}BusIdin the generatedsystem.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-welcomefirst-run wizard (Shipped).docs/KEYBINDINGS.mdauto-generator (Shipped).docs/TROUBLESHOOTING.md(Shipped).docs/index.md/ README docs index (Shipped —README.mdlinks every doc indocs/).nomarchy-manual— opens the local~/.local/share/nomarchy/README.mdviaxdg-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.
- on every push to
- Versioning scheme:
vYY.MM.xmatching the upstream NixOS channel (e.g.v25.11.3). nixosTestper palette: bootsdefaultin 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-buildthat 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):
- Installer —
installer/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. - First-boot UX —
nomarchy-welcome, generatedhome.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. - Core system modules —
core/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 againstdocs/OPTIONS.md. - Core home modules —
core/home/*(options, state, behavior, overrides, deployed config). Verify every home-sidenomarchy.*option does what its description claims; confirm~/.config/nomarchy/overrides/actually overrides. - 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.mdagainst runtime. - Apps —
features/apps/*. Each app: launches, themed via Stylix, configured as expected. Catches the "we package it but nobody configured it" class. - Theme engine + palettes —
nomarchy-theme-setacross 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. - Scripts (runtime behavior) — Pillar 3 confirmed existence; this sweep runs every user-visible script (especially every
nomarchy-menuentry) on current NixOS and confirms it actually does the thing. - ISOs — boot
nomarchy-installerandnomarchy-live; verify thenomarchy-test-live-isoflow; check the installer ISO ships every toolinstall.shcalls (regression class:hardware-db.shmissing, already shipped). - Lib + state schema —
lib/state-schema.nix, color resolution, path helpers. Cross every codepath that producesstate.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-22 — VSCode theme extensions pinned for 10 marketplace palettes. Before this fix, only the 6 palettes whose theme extensions ship in
pkgs.vscode-extensions(catppuccin, catppuccin-latte, nord, tokyo-night, rose-pine, gruvbox) had working VSCode theming — every other palette hadworkbench.colorThemeset to a theme VSCode couldn't find, so it silently fell back to the built-in default. Including the defaultsummer-nightpalette (sainnhe.everforest), which meant the default install had broken VSCode theming. Probed all 13 unique extensions against the VSCode marketplace extensionquery API; 10 exist (sainnhe.everforest,shadesOfBuntu.flexoki-light,qufiwefefwoyn.kanagawa,oldjobobo.{lumon,miasma,retro-82}-theme,TahaYVR.matteblack,jovejonovski.ocean-green,monokai.theme-monokai-pro-vscode,Bjarne.white-theme) and 3 don't (Bjarne.{ethereal,hackerman,vantablack}-nomarchy— unpublished custom Nomarchy themes; logged as a new Later row). Fetched the latest version + sha256 for each of the 10 vianix store prefetch-fileagainsthttps://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage. Added amarketplaceExtensionslist tofeatures/apps/vscode.nixthat wraps each entry inpkgs.vscode-utils.extensionFromVscodeMarketplace { publisher; name; version; sha256; }and concatenates with the existing nixpkgs-packaged list. Smoke-builtsainnhe.everforestend-to-end to confirm the URL pattern + sha256 resolve. Documented the version-bump procedure in the module comment.docs/OPTIONS.mdupdated to drop the "still break" caveat for everything except the three Bjarne palettes. - 2026-05-22 — Chromium static
Default/Preferencesdeleted.features/apps/chromium/default.nixwas deploying a 204-byte staticDefault/Preferencesvia Home Manager symlink into Chromium's mutable profile directory. Chromium expects to write that file at runtime, so the symlink-into-store deployment was structurally broken (Chromium either fails to save, or replaces the symlink on first write — losing whatever the static file claimed to set). The contents (extensions.theme.{use_system,use_custom} = false,browser.theme.{color_scheme,user_color} = 2) are duplicates of the managed-policy intent incore/system/browser.nix(BrowserThemeColorfrom palettebase00,BrowserColorSchemefromisLightTheme) — and worse, the staticcolor_scheme = 2hardcoded "dark" while the policy is dynamic, so a light-palette user would have hit a conflict. Removed the wholefeatures/apps/chromium/directory (8 lines + the 204-byte file) and dropped the import fromfeatures/default.nix. Chromium theming continues to flow through the system-level managed policy, which is the canonical chromium-on-NixOS path. - 2026-05-22 — Plymouth boot splash follows the active palette.
themes/engine/plymouth/nomarchy.scripthadWindow.SetBackgroundTopColor(0.101, 0.105, 0.149)hardcoded — a Tokyo-Night-ish#1a1b26— andnomarchy.plymouthhad a matchingConsoleLogBackgroundColor=0x1a1b26. Both were frozen regardless ofnomarchy.system.theme. Replaced the literals with@BG_R@/@BG_G@/@BG_B@/@BG_HEX@placeholders;themes/engine/plymouth.nixnow reads the active palette vianomarchyLib.getPalette config.nomarchy.system.theme, convertspalette.base00into three 0.0–1.0 floats (Nix has no FP math, so(byte * 1000) / 255integer division formatted as0.XXX), andsed-substitutes duringinstallPhase. Smoke-built the derivation against the defaultsummer-nightpalette: emits0.176, 0.207, 0.231(matches0x2d353b) andConsoleLogBackgroundColor=0x2d353b. Closes the "Plymouth theme variants per palette" Next-column item. - 2026-05-22 —
nomarchy.overrides.*loader implemented. The option surface (enable,paths) had existed incore/home/overrides.nixsince 2026-05-18 but did nothing —pathswas a reserved attrset that never reachedxdg.configFile. Now wired: every entry innomarchy.overrides.pathssubstitutes the matchingxdg.configFile.<key>.sourceatlib.mkForcepriority, beating Nomarchy's ownlib.mkDefaultwrites. Other fields on the original entry (recursiveetc.) survive via the standard module-system merge. Picked the attrset model from the row's two options rather than runtime~/.config/nomarchy/overrides/directory discovery — Nix needs every managed file declared at evaluation time, and the attrset matches the explicit-config shape used everywhere else in the Nomarchy surface.docs/OPTIONS.mdupdated: bothoverrides.{enable,paths}entries gain real content + an example, theconfigOverridesrow now contrasts bulk-vs-per-file accurately, and the "Where these are defined" footer drops the (reserved) tag. Closes the Next-column row. Unlocks the future replacement for the removed Setup→Config menu. - 2026-05-22 — Accessibility home-side companion shipped. New
nomarchy.accessibility.enablehome option (mirror ofnomarchy.system.accessibility.enable) pluscore/home/accessibility.nixthat, when enabled, contributes a HyprlandextraConfigblock vialib.mkAfter: slowsinput.repeat_rateto 25 (from 40) andinput.repeat_delayto 1000 ms (from 600) so holding a key isn't a runaway machine-gun for low-mobility users, and bindsSUPER+ALT+Sto launch the Orca screen reader (the system preset already putsorcaon PATH). ThemkAfterpriority guarantees the input slowdown wins over the templatedinput.confdefaults. Documented indocs/OPTIONS.md. The third item from the original Next row — a high-contrast palette — is split into its own Later row because it's a design task (24-colour WCAG AAA palette + icon family choice) that wants its own review. - 2026-05-22 — Gaming preset: flathub remote registered automatically.
services.flatpak.enable = true(set insidecore/system/gaming.nix'smkIf cfg.enableblock) shipped flatpak but didn't add any remotes —flatpak installand the Discover GUI returned empty results until the user ran the manualflatpak remote-addone-liner. nixpkgs has no declarative remote-add API. Addedsystemd.services.nomarchy-flathub-init: aType=oneshot,RemainAfterExit=trueunit that runsflatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepoafternetwork-online.target. The--if-not-existsflag keeps it idempotent across reboots and re-runs. Lives under the gaming preset (where flatpak is wired today); lift to a dedicated module when another preset needs flatpak. Closes the "Gaming — declarative flathub remote" Next-column item. - 2026-05-22 —
nomarchy-menu"Setup → Config" submenu removed. Of the nine entries, five (hyprland.conf,hypridle.conf,hyprsunset.conf,walker/config.toml,waybar/config.jsonc) opened Home-Manager-generated files that get clobbered on the nexthome-manager switch; two (hyprlock.conf,swayosd/config.toml) pointed at paths the modules don't deploy at all;XComposewas a HM-managed symlink to the Nix store (read-only). The "edit + restart" pattern was an Omarchy holdover that didn't translate to Nomarchy's declarative-first model. Removedshow_setup_config_menuentirely and dropped the " Config" item fromshow_setup_menu(closes the case branch in the parent menu). Persistent settings now go through the matchingnomarchy.*option in/etc/nixos/home.nix(orsystem.nix); when thenomarchy.overrides.*loader ships, the menu can come back routed through~/.config/nomarchy/overrides/. Side effect:nomarchy-restart-xcomposenowunused?indocs/SCRIPTS.md(regenerated) — left as a future Pillar 3 cleanup, not widened into this PR. - 2026-05-22 —
toggles.waybaris now a Nix-level gate.features/desktop/waybar/default.nixpreviously setprograms.waybar.{enable,systemd.enable} = lib.mkDefault trueunconditionally, so the bar came back on every rebuild/reboot regardless ofnomarchy.toggles.waybar. The toggle script consumedNOMARCHY_TOGGLE_WAYBARbut only via runtime pkill/exec — purely session-local. Same shape as the just-fixed nightlight: both options now drive theirprograms.X.enable/services.X.enablesymmetrically withtoggles.idle→services.hypridle.enable.programs.waybar.{enable,systemd.enable}now followconfig.nomarchy.toggles.waybar; the toggle script flips the running unit viasystemctl --user start/stop waybar.servicefor instant feedback and writes.waybarback tostate.jsonso the next rebuild realigns.nix flake check --no-build+bash -nclean. - 2026-05-22 — Nightlight reconciled: hyprsunset gated on the toggle. Path (b) from the Later row.
features/desktop/nightlight.nixpreviously setservices.hyprsunset.enable = lib.mkDefault trueunconditionally and baked the temperature (4000K or a neutralising 6500K) intoextraArgsat Nix-eval time, while the toggle scriptpkill'd the daemon on disable andhyprctl dispatch exec hyprsunset --temperature 4000'd a new one on enable — racing the systemd unit and hardcoding 4000K regardless ofnomarchy.nightlightTemperature. Now:services.hyprsunset.enable = lib.mkDefault config.nomarchy.toggles.nightlight(symmetric withservices.hypridle.enable←toggles.idle),extraArgsalways uses the option value, and the toggle script flips the running unit viasystemctl --user start/stop hyprsunset.service, readsnightlightTemperaturefromstate.jsonfor the notification, and writes.nightlightback tostate.jsonso the next rebuild realigns. Dropped the misleading "Always enabled, we control via IPC and state" comment.nix flake check --no-build+bash -nclean. - 2026-05-22 — Installer keymap reaches Hyprland's Wayland session.
core/home/config/nomarchy/default/hypr/input.confhardcodedkb_layout = us, so the installer'sservices.xserver.xkb.layout/console.keyMapwrites only reached XWayland and the TTY — native-Wayland apps fell back to US. Option-route fix (path (a) from the Later row): addednomarchy.keymap.{layout,variant}tocore/home/options.nix(defaults"us"/""); deleted the staticinput.conffrom the bulknomarchy/deploy; moved it intocore/home/configs.nixas an explicitxdg.configFile."nomarchy/default/hypr/input.conf".text = ''…''that interpolates the option values. Installer'shome.nixheredoc now writesnomarchy.keymap = { layout = "$KEYMAP_LAYOUT"; variant = "$KEYMAP_VARIANT"; };alongsidenomarchy.formFactor, so a non-US install propagates the layout consistently to Hyprland, XWayland, and the TTY. Documented indocs/OPTIONS.md.nix flake check --no-buildclean. - 2026-05-22 —
flake.nixpalette imports consolidated throughnomarchyLib.flake.nixwas re-importing./themes/palettesand recomputingthemeNamesviabuiltins.attrNameseven thoughlib/default.nixalready exports both. Two evaluations of the same data set with the same result today — drift risk tomorrow. AddednomarchyLib = import ./lib { inherit lib; }once in the outputsletand reused it viainherit (nomarchyLib) themeNames;for theallThemeVariantslinkFarm.lib/default.nixis now the single source of truth for the theme list — modules that need palette data import../../libthe same way and resolve to the same evaluation.nix flake check --no-buildclean. - 2026-05-22 —
programs.uwsmmoved tocore/system/session.nix. The session-manager wiring (uwsm + the Hyprland Wayland-compositor entry that gives Hyprland a propergraphical-session.targetso user services likenomarchy-wallpaper, walker and elephant chain off it) had lived incore/system/virtualization.nixby historical accident — loaded unconditionally on every install, nothing to do with libvirt/docker. Lifted into a dedicatedcore/system/session.nixand imported fromcore/system/default.nixbetweensystemd.nixandvirtualization.nix.virtualization.nixnow contains only the libvirt + docker branches its filename implies.nix flake check --no-buildclean. No behaviour change. - 2026-05-22 —
themes/templates/*.tplpruned. Deleted 9 of the 11 mustache templates after verifying their output paths are either preempted by Nix-side writes (hyprland.conf.tplshadowed bythemes/engine/files.nix:100;kitty.conf.tpl+ghostty.conf.tplshadowed by the per-palette generators added in commit8d3ce2d), unread by anything (hyprlock.conf.tpl,alacritty.toml.tpl,btop.theme.tpl,chromium.theme.tpl,swayosd.css.tpl— the corresponding apps are themed via Stylix / declarative Home-Manager options / the system policy module, not from the theme symlink), or orphaned (hyprland-preview-share-picker.css.tpllost its consumer when the share-picker dir was deleted in20de3d4). Onlyobsidian.css.tpl(consumed bynomarchy-theme-set-obsidianto seed every Obsidian vault's theme) andkeyboard.rgb.tpl(consumed bynomarchy-theme-set-keyboard-asus-rogto set the ROG keyboard tint) stay. Rewrote Step 6 ofdocs/creating-themes.mdto describe the two remaining templates explicitly and corrected a long-standing path bug ("~/.config/nomarchy/themed/" → "~/.config/nomarchy/themes/templates/" — the script actually reads the latter).nix flake check --no-buildclean. - 2026-05-22 — Pillar 4: "What's installed?" first-boot summary. New
nomarchy-installed-summaryscript renders a markdown table (viagum format, plain fallback) showing the install shape the user should verify before customising: theme / font / panel position (read from~/.config/nomarchy/state.json), timezone / DNS / hybrid-GPU (read from/etc/nixos/state.json), form factor (BAT*sysfs check — same signal the installer uses), software profiles (heuristic via presence of marker binaries:docker→ Dev,steam→ Gaming,libreoffice→ Office,obs→ Media,rg→ CLI Utils), FDE status (anycryptentry inlsblk), and the drive layout (filteredlsblk -no NAME,SIZE,TYPE,MOUNTPOINT).nomarchy-welcomenow calls it as Step 0 (gated on agum inputso the user acknowledges before customisation rewrites anything) and the same command works standalone from any terminal. No installer-side changes — the script is fully self-contained against existing state files and live introspection. Closes the "Installer: What's installed? summary on first boot" Now-column item. - 2026-05-21 — Pillar 8 / Component 9 (ISOs): closeout — Pillar 8 code-audit phase complete. Code-review-shaped sweep over
hosts/{nomarchy-installer,nomarchy-live}.nix, theinstallation-cd-minimal/installation-cd-graphical-basemodule chain, and the four ISO build/test scripts. Two minor fixes inline:nomarchy-build-isoandnomarchy-build-live-isoboth ran underset -ebut then wrappednix buildin anif [ $? -eq 0 ]block — theelsebranch printing "Error: ISO build failed." was unreachable becauseset -eaborts before the conditional. Removed the dead branches (behaviour identical: the user seesnix build's own error and the script exits). Regression-class check (hardware-db.shprecedent): cross-referenced every toolinstall.shcalls against the installer host'senvironment.systemPackageschain —gptfdisk(sgdisk) is provided by upstreamprofiles/base.nix:21whichinstallation-cd-base.nixchains,jqis wrapped in thenrunnix-run fallback, and every other direct call (wipefs,dd,parted,partprobe,cryptsetup,disko,nixos-{install,enter,rebuild},loadkeys,timedatectl,nmtui) resolves via either the explicit host packages or the standard base.nomarchy-livehost shape verified: multi-GPU initrd modules + Xwayland video drivers cover both real hardware and QEMU; auto-login + passwordless sudo + helpful TTY MOTD + Hyprland on-boot exec to a terminal at the install command.nomarchy-test-live-isowalks four OVMF candidate paths with KVM detection. With this entry, every code-shaped audit in Pillar 8 has shipped (Components 1–10); the Now-column "Full QA audit" item moves out, replaced by a runtime-verification punch-list entry covering the cross-component "needs runtime verification" notes from each closeout. - 2026-05-21 — Pillar 8 / Component 8 (Scripts runtime behavior): closeout. Code-review-shaped sweep over
features/scripts/utils/nomarchy-menu(382 lines, 23 submenu functions), every script referenced from those submenus, the schema↔script field-name cross-check, and cross-cutting typo/stale-reference patterns. Four real fixes inline: (1)nomarchy-menu:70— "Learn → Nomarchy" still callednomarchy-launch-webapp https://learn.omacom.io/2/the-nomarchy-manual(an upstream Omarchy URL — the same one fixed innomarchy-manualback on 2026-05-18). Now callsnomarchy-manual, which opens the local docs index. (2)nomarchy-menu:179— "Style → Hyprland" opened~/.config/hypr/looknfeel.conf, a path nothing deploys; the actual file lives at~/.config/nomarchy/default/hypr/looknfeel.conf(sourced via the chain fromnomarchy.conf). Updated the path. (3)nomarchy-menu:258—*Overrides*) xdg-open ~/.config/nomarchy/overrides/case branch with no matching menu option, dead code anticipating the still-unimplementednomarchy.overrides.*loader. Removed (will reappear with the option when the loader ships). (4)nomarchy-theme-bg-next:12—jq -r '.theme // "nord"'defaulted to"nord"if.themewas missing, whilelib/state-schema.nix:17defines"summer-night"as the schema default. On a fresh-or-emptystate.jsonthe script looked for backgrounds underpalettes/nord/while the rest of the system treatedsummer-nightas active. Matched to the schema default. Cross-cutting sweeps came back clean: no$NN[A-Z]+env var typos elsewhere (the prior pair fixed in40b6212was the lot), no references to scripts deleted in earlier Pillar 3 batches (nomarchy-restart-{hyprctl,mako,tmux},nomarchy-battery-present,nomarchy-sudo-keepalive,nomarchy-rollback,nomarchy-snapshot,nomarchy-migrate-state,nomarchy-config-direct-boot,nomarchy-npx-install,nomarchy-webapp-handler-{hey,zoom}), no strayomarchy/omacomstrings outside historical roadmap entries, and everystate.jsonfield-write resolves againstlib/state-schema.nix(or the documented off-schemawelcome_done). One UX-shaped pattern bug logged separately to Later:show_setup_config_menuedits Nix-managed files that get clobbered on the nexthome-manager switch. Runtime verification (run every user-visible menu entry and confirm it does the thing) remains on the user. - 2026-05-21 — Pillar 8 / Component 7 (Theme engine + palettes): closeout. Code-review-shaped sweep across
themes/engine/{stylix,stylix-compat,loader,files,scripts}.nix, the 23 theme-engine scripts, and the 21 palettes' file completeness. Three real fixes inline + targeted dead-surface cleanup: (1)nomarchy-theme-setprinted a warning when the named theme directory didn't exist but continued executing — wrote the bad name intostate.jsonand rannomarchy-env-updateon a broken state. Nowexit 1after the warning. (2)nomarchy-theme-bg-set(called by the walker background-selector menu and by thenomarchy-wallpaperCLI) updated the live~/.config/nomarchy/current/backgroundsymlink + restarted swaybg but never wrotestate.json— so every wallpaper picked via either path silently reverted to the theme default on the nexthome-manager switch(themes/engine/files.nixre-resolvesnomarchy.wallpaperat every rebuild). Now writes the chosen path intostate.json.wallpaper, mirroringnomarchy-theme-bg-next. Added a file-exists check so a bogus path fails loudly instead of leaving a dangling symlink + a crashed swaybg. (3) Palette tree dead-surface cleanup: deletedthemes/palettes/{flexoki-light,lumon,retro-82,rose-pine}/apps/chromium.theme(9-byte RGB strings nothing reads — chromium is themed via managed policies incore/system/browser.nix, not per-palette files) andthemes/palettes/summer-day/apps/kitty/{kitty.conf,everforest-light.conf}(a 76KB stray kitty config at the wrong nested path, superseded by thekitty.confgenerator added in8d3ce2d). Total: 6 files / 2210 lines. Updated the misleading comment innomarchy-themes-prebuild("the installer wires this up") to reflect reality (the installer only tips the user to run it). Updated thethemes/templates/*.tplLater row with a fact-check + concrete categorisation — the templates ARE consumed bynomarchy-theme-set-templates, but most write to paths nothing reads or are now superseded by Nix-side generators. Palette completeness matrix: all 21 palettes havecolors.toml,backgrounds/,icons.theme, andapps/; 5 carry thelight.modemarker (catppuccin-latte, flexoki-light, rose-pine, summer-day, white); only tokyo-night shipskeyboard.rgbfor the ASUS ROG path, and the keyboard-set chain isn't wired intonomarchy-theme-setso it stays manual — niche enough to leave. Runtime verification (switch through all 22 palettes and eyeball SDDM + Plymouth + GTK + Qt + terminals + browsers + waybar + walker rendering) remains on the user. - 2026-05-21 — Pillar 8 / Component 6 (Apps): closeout. Code-review-shaped sweep over
features/apps/{alacritty,btop,chromium,elephant,ghostty,kitty,lazygit,opencode,swayosd,tmux,vscode,walker}. Three real theming bugs fixed inline: (1)features/apps/kitty/config/kitty.conf:1andfeatures/apps/ghostty/config/config:2referenced palette-specific include files (~/.config/nomarchy/current/theme/{kitty,ghostty}.conf) that didn't exist for any of the 22 palettes — kitty include failed silently, ghostty's was optional (?-prefix), and both terminals rendered with their built-in defaults regardless of the active Nomarchy palette. Stylix'skitty.enable = truewas a no-op because the module usesxdg.configFileinstead ofprograms.kitty; ghostty has no Stylix target. Added theme-engine generators inthemes/engine/files.nixmirroring the existingwaybar.csspattern, mappingpalette.base*to kitty/ghostty color directives. (2)features/apps/btop/config/btop.conf:5setcolor_theme = "current"butthemes/engine/loader.nix:72deploys the active palette's btop theme to~/.config/btop/themes/nomarchy.theme— name mismatch, btop fell back to its built-in Default theme on every palette. Renamed to"nomarchy". (3)programs.vscode.profiles.default.userSettings.workbench.colorThemewas set unconditionally fromthemes/palettes/<theme>/apps/vscode.json, but the matching theme extensions were bundled withdevExtensions(defaultfalse) — so VSCode silently fell back to its built-in theme out of the box on every palette. SplitthemeExtensions(always-on, covers the 6 palettes whose theme extension is in nixpkgs) fromdevExtensions(opt-in). The remaining 15 palettes — including the defaultsummer-night(sainnhe.everforest) — still break because their theme extensions aren't packaged in nixpkgs; logged as a new Later row. Chromium staticDefault/Preferencessymlink already had an open Later row; verified the file's contents are duplicate of the managed-policy intent incore/system/browser.nix, so the existing entry's hypothesis is correct — left for the user to greenlight deletion. alacritty (Stylix-themed viaprograms.alacritty.settings), elephant (no UI), swayosd (base16 inline), walker (covered in Component 5), lazygit + tmux (terminal ANSI inheritance, transitively fixed by the kitty/ghostty changes), and opencode (minimal opt-in config) are healthy. Runtime verification (launch each app on each palette and eyeball the theming) remains the user's responsibility. - 2026-05-21 — Pillar 8 / Component 5 (Desktop stack): closeout. Code-review-shaped sweep over Hyprland, waybar, walker, hypridle, hyprsunset, mako, KEYBINDINGS.md (the runtime-rendering subset — waybar across panel positions × form factors × all 22 palettes, walker launcher modes, hypridle timeout feel — stays on the user). Five real bugs fixed inline: (1) 9 of 17
~/.config/nomarchy/default/hypr/apps/*.confwindow-rule files were deployed but never sourced, includingsystem.conf(thetag +floating-windowrules every TUI helper class relies on +class:org.nomarchy.screensaverfullscreen rule that hypridle's 150s on-timeout depends on) andpip.conf(the PiP pin/size rules).apps.confnow sources all 17. (2) Two$NNOMARCHY_TOGGLE_*typos (double-N) innomarchy-menu:330andnomarchy-launch-screensaver:16madetoggles.suspendandtoggles.screensavervacuous — Suspend always showed in the system menu and the screensaver always launched at idle regardless of the documented option. (3) 4 broken per-palette waybarstyle.cssoverrides (catppuccin,lumon,nord,retro-82) fully replaced the default style with 2–14 lines of only@define-colordeclarations — picking those palettes produced a waybar with zero structural styling. Default style already imports per-palette colors viathemes/engine/files.nix-generatedtheme/waybar.css, so deletion restores correct rendering;summer-day/summer-nightkept as legitimate 100+-line redesigns. (4)core/home/config/nomarchy/default/hypr/{bindings,plain-bindings}.confwere explicitly-labeled deprecated files sourced by nothing (plain-bindings.conf referenced undefined$terminal/$browser/etc. Hyprland vars) — deleted;docs/SCRIPTS.mdregenerated to drop stale callers and incidentally corrected 4 Origin columns whose scripts moved fromcore/system/scripts/tofeatures/scripts/utils/. (5) Mako post-fix (commit2a301a0) verified: deployment + the 4 referenced scripts (nomarchy-notification-dismiss,nomarchy-launch-wifi,nomarchy-launch-floating-terminal-with-presentation,nomarchy-menu-keybindings) all resolve. Two structural inconsistencies logged to Later: keymap routing (already in72f7e7b) and the new hyprsunset toggle-vs-systemd reconcile.KEYBINDINGS.mdregenerated with zero diff — generator already covers both binding source locations. Runtime verification (boot live ISO, eyeball waybar/walker/screensaver flows across panel positions and palettes) remains the user's responsibility before declaring Component 5 fully closed. - 2026-05-18 — Hardware DB correctness pass + ROG Ally support + CI lint. Audited every
nomarchy-hardware-dbentry againstinputs.nixos-hardware.nixosModulesand found 21 of 43 entries (49%) referenced modules that don't exist —microsoft-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, notframework-13-11th-gen-intel); ThinkPad X1 modules arex1-Nth-gen, notx1-carbon-genN; Surface Pro 6/7/8/10 all sharemicrosoft-surface-pro-intel; Surface Book / Intel Surface Laptop have no module (rows dropped, generic detection still emits sensiblecommon-pc-laptop+ cpu/gpu). Added matchers for ROG Ally (RC71L / RC72LA / "ROG Ally" viaasus-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 innixos-hardware.nixosModules— closes this regression class. - 2026-05-18 —
nomarchy-manualre-targeted at local docs. The script'sxdg-openpreviously pointed athttps://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 perSKILL.md's "Out of Scope" note), with anotify-sendfallback if the source tree isn't synced. - 2026-05-18 — Docs hygiene: STRUCTURE.md "Root Directory" + Pillar 6 reality-check.
docs/STRUCTURE.mdlisted three top-level files that don't exist (GEMINI.md, root-levelSTRUCTURE.md,TODO.md) — replaced with an accurate root listing plus adocs/sub-tree that names every doc. Pillar 6 in this file hadnomarchy-welcome,docs/TROUBLESHOOTING.md, and the "docs index" bullet still marked Next despite all three shipping on 2026-04-26 — moved to(Shipped).nomarchy-manualbullet's "orphaned reference today" claim was stale (the script is called fromnomarchy-menuandnomarchy-theme-install); rewritten to reflect the real remaining issue — its hardcodedxdg-open https://learn.omacom.io/2/the-nomarchy-manualis an Omarchy URL. - 2026-05-18 — Installer state.json is now schema-driven. Replaced the heredoc in
installer/install.shthat hardcoded the JSON literal (theme/dns/wifi/features/etc.) with anix evaloflib/state-schema.nix'ssystemblock, 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'sbuiltins.toJSONsorts keys; toggle scripts read/write viajqso it's invisible to them). Dry-run path unchanged (still bind-mounts a fake/mntso the generator's absolute paths resolve correctly).bash -n+shellcheck --severity=errorclean. - 2026-05-18 — Complete the hybrid-GPU wiring + fix unoverridable state-derived options. Two related fixes shipped together. (1)
nomarchy.system.features.hybridGPU = truenow 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 onlysupergfxdmode-switching while leaving the system with no NVIDIA driver loaded, so mode switches silently no-op'd. All knobs uselib.mkDefaultso a downstreamsystem.nixcan pin a beta driver, flip to the open kernel module, etc. Bus-ID prime config (per-machine) stays user-supplied —docs/OPTIONS.mdhas the full recipe. (2) Bothcore/system/state.nixandcore/home/state.nixnow uselib.mkDefaulton 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.nixnow also reads fromlib/state-schema.nixlikecore/home/state.nixdoes, completing the schema-centralization started two batches ago. Verifiednix 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)--resumewith 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_statenow stamps an ISO-8601 timestamp andload_stateshows a(saved Xm ago)banner plus aTarget: /dev/X → user @ hostsummary line, so the user canCtrl-Cif they're resuming onto the wrong host before any destructive prompt fires; (4)--helpnow documents the tmpfs limitation.shellcheck --severity=errorpasses. - 2026-05-18 — Declarative-state defaults centralization. Made
lib/state-schema.nixthe single source of truth for every state-default that previously lived in three places (the schema itself,core/system/options.nix/core/home/options.nixdefault = …clauses, andcore/home/state.nixor …fallbacks). Replaced ~25 hardcoded literals withschema.<scope>.<key>reads. Side-effect: fixed a lingering bug wherecore/home/options.nix:themestill 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-buildconfirms zero semantic change for every other field. Doesn't touch the installer-writtenstate.json(separate batch — needs schema → JSON generation). - 2026-05-18 — Pillar 7 first step: Forgejo Actions CI (eval + lint). New
.forgejo/workflows/check.ymlruns on every push tomainand every PR: (1)nix flake check --no-buildto catch eval regressions, (2)bash -n+shellcheck --severity=errorover everynomarchy-*bash script (whole-tree, not just changed files — gates branches that bypass the pre-commit hook), (3)docs/SCRIPTS.mddrift 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 aforgejo-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-18 — Pillar 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 callshyprctl reload/makoctl reloaddirectly 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 inSKILL.mdso the audit catches them askeptand 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, allkept,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.desktopMimeType registration anywhere routedmailto:/zoom:URIs to them, so the handlers could never fire. Surfaced six useful CLI tools inSKILL.md"Common Tasks" so they're discoverable by AI assistants and taggedkeptby 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 rollbackalready cover this),nomarchy-snapshot(usedsnapper; 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), andnomarchy-npx-install(Arch idiom —nix-shell -p nodejsis the NixOS path). Keptnomarchy-build-isoandnomarchy-build-live-isoand surfaced them in README §2 so the audit tags themkept. Script count 171 → 166. - 2026-05-18 — Pillar 3 Phase B: missing-references triage. (1) Wrote
themes/engine/scripts/nomarchy-theme-nextsoSKILL.md's documented "cycle to next theme" command resolves; (2) scrubbed three stalenomarchy-dev-*references fromcore/home/config/nomarchy-skill/SKILL.md; (3) added a line-context filter to bothnomarchy-docs-scriptsgenerators that dropsnomarchy-*tokens appearing in Nixpname/derivation idents,/tmp/&/etc/sudoers.d/paths,nixosConfigurations.*/packages.*flake outputs,mktemp -tprefixes, systemd unit vars,./result/bin/run-binaries, anddockercontainer 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-welcomebanner andnomarchy-versioncodename ("Sovereign"); (3) Verified existingcore/system/branding.nixhandles 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.txtandscreensaver.txtbranding files; (3) Cleaned up conflicting keybindings by removing deprecatedtiling.confand updating the doc generator; (4) Removed legacy Nord theme hack fromnomarchy-theme-set; (5) Fixed JSON parse error insummer-daywaybar 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) Injectedx-systemd.requiresandx-systemd.device-timeout=0into 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, andnomarchy-wallpaperCLI wrappers to use modern Walker menus; (2) Removed the obsolete and brokenthemes/engine/switcher.nixand its associated Nix-inlined scripts; (3) Cleaned up remaining$NOMARCHY_PATHreferences from the Omarchy era. - 2026-05-03 — Fixed
/etc/nixosownership after installation. Added achown -R $USERNAME:users /etc/nixosstep vianixos-enterat the end ofinstaller/install.shso the main user owns their configuration and can runhome-managercommands withoutsudo. - 2026-05-01 — Installer & Script Audit Polish. (1) Fixed a critical bash dynamic scoping bug in
installer/install.shwhererc=0assignments inside functions (Impermanence, Form Factor) were clobbering the main loop's return code, causing the installer to abort when "No" was selected; (2) Polishedhosts/nomarchy-live.nixwith auto-login for thenixosuser and passwordless sudo for thewheelgroup; (3) Repurposednomarchy-toggle-suspendto executesystemctl suspenddirectly and updatednomarchy-menuto reflect this; (4) Updatednomarchy-launch-wifito usenmtuiin Alacritty; (5) Regenerateddocs/SCRIPTS.mdto reflect the updated script mappings. - 2026-04-30 —
set -esweep acrossnomarchy-*scripts. Addedset -eto 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-menuruns withoutset -ebecause it's an interactive UX loop where action failures should re-display the menu rather than abort the script. Pre-commit hook now enforcesbash -n+shellcheck --severity=errorso future scripts can't regress this. - 2026-04-30 — Installer disk-phase reliability. Hardened
installer/install.shand consolidated the disko configs: (1)select_disknow hides the live-ISO boot device(s) so the installer can't format its own boot media (NOMARCHY_INSTALL_ALLOW_ISO_TARGET=1to override); (2) added a 10 GiB minimum-capacity preflight; (3)prewipe_target_driveenumerates every active dm-crypt mapping backed by the target drive and closes them, drops the silent|| truefromwipefs/sgdisk/dd, boundsudevadm settleto 30s, and refuses to continue if anything is still mounted; (4) wrapped the disko call inrun_disko_with_retrywith last-30-lines + Retry / View full log / Abort dialog on failure; (5) replaced the sed-templateddisko-golden.nix+disko-btrfs-multi.nixpair with a singledisko-config.nixNix 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.enableoption (mirror ofnomarchy.system.gaming.enable) andcore/home/gaming.nixmodule that injects a Hyprlandwindowrulev2 = 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. Updatedfeatures/desktop/hyprland/config/monitors.confand 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 starterhome.nixif missing. State is now persisted instate.jsonvia.welcome_done. Addednomarchy.panelPositionoption to Waybar. - 2026-04-26 — Multi-disk BTRFS support in the installer. Added
installer/disko-btrfs-multi.nixtemplate and updatedinstaller/install.shto allow selecting multiple drives viagum 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_INSTALLERandNOMARCHY_LIVE. Fixed branding in Plymouth theme metadata and SDDM metadata. - 2026-04-26 — Distro Branding Phase 1. Renamed
installerIsotonomarchy-installerandinstallerIsoGraphicaltonomarchy-live. Updated metadata and host configurations. Scrubbed "Omarchy" from Plymouth and installer messages. - 2026-04-26 — Fix
hardware-db.shmissing innomarchy-installer.nix. Resolved boot error whereinstall.shfailed 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-26 —
docs/TROUBLESHOOTING.md. The five most common rebuild errors (option-already-declared, attribute-missing, Stylix target conflict, home-manager.hm-bakchurn, impermanence path missing) with copy-paste fixes. Linked fromREADME.mdanddocs/MIGRATION.md. - 2026-04-26 — Gaming preset module (
core/system/gaming.nix). Opt-innomarchy.system.gaming.enable(default false). Wiresprograms.steam(withremotePlay/localNetworkGameTransfersfirewall holes viamkDefault),programs.gamemode, andservices.flatpak. Flathub remote and Hyprland window-rule split into separate Next-column rows. - 2026-04-26 — Accessibility preset module (
core/system/accessibility.nix). Newnomarchy.system.accessibility.{enable,cursorSize}options (opt-in, default off — accessibility isn't a hardware-derived signal). Enablesservices.gnome.at-spi2-core, installs Orca, and setsXCURSOR_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). Newnomarchy.system.desktop.enableoption; defaults toformFactor == "desktop"(mirror of the laptop preset's auto-enable). PinspowerManagement.cpuFreqGovernorto"performance"and enablesservices.zfs.{autoScrub,trim}so a future ZFS pool gets sensible maintenance for free. - 2026-04-26 — Laptop preset module (
core/system/laptop.nix). Newnomarchy.system.laptop.{enable,thermald}options;enabledefaults toformFactor == "laptop"so the installer's existingformFactorwrite auto-flips it on. Wires TLP (governors + 75/80 charge thresholds), force-disablespower-profiles-daemon, enablesupowerandthermald(x86_64), adds the brightnessctl udev rule for backlight without root, and sets a logind lid-switch policy that defers tohibernation.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.packagesand 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-*, andnomarchy-theme-*wrappers. Moved desktop scripts to packaged utility directory. - 2026-04-25 — Docker & fwupd support. Added
nomarchy.system.virtualization.docker.enableandnomarchy.hardware.fwupdoptions. Wires system services and addsdocker-composeandfwupdmgrto PATH. - 2026-04-25 — Installer VM testing. Added
installerVmto flake nixosConfigurations, packages, and apps.nomarchy-test-installernow usesnix run .#installerVm. - 2026-04-25 —
docs/KEYBINDINGS.mdauto-generator. New repo-tooling scriptbin/utils/nomarchy-docs-keybindingsparses everybindd =/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 fromROTA+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-scriptsgenerator producesdocs/SCRIPTS.mdwith 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,}.formFactoroption; waybar drops battery widget on desktop; nm-applet visibility fix in default theme; live-ISO baseline keymap/locale (a7e7fa9). - 2026-04-25 —
docs/OPTIONS.mdreference;docs/MIGRATION.mdlinked fromREADME.md(3cb012b,6ef28f0).