- Rename installerIso and installerIsoGraphical to nomarchy-installer and nomarchy-live. - Update host configurations with proper Nomarchy branding and volume IDs. - Fix nomarchy-test-live-iso QEMU launch by using -drive if=pflash for UEFI firmware. - Add nomarchy-build-live-iso utility script. - Scrub remaining Omarchy references in Plymouth, installer messages, and docs. - Regenerate docs/SCRIPTS.md to reflect new and renamed utilities.
16 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)
- (empty — pick the top of Next.)
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_delaydefaults,SUPER+ALT+Skeybinding to launch Orca, and a high-contrast palette underthemes/palettes/. Gated on a newnomarchy.accessibility.enablemirror of the system option. - Gaming — Hyprland window rule. Companion to the gaming preset: a Hyprland
windowrulev2 = fullscreen, class:^(steam_app_).*$(or similar) so games launched from Steam grab the whole screen. Lives incore/home/config/nomarchy/default/hypr/and gates on a newnomarchy.gaming.enablemirror. - Gaming — declarative flathub remote.
services.flatpak.enabledoesn't ship a declarative remote API in nixpkgs. Either add theflatpak-managed-installoverlay, write a one-shot systemd unit that runsflatpak remote-add --if-not-exists flathub …, or surface the manual step innomarchy-welcome. - First-run welcome wizard. Extend
nomarchy-welcomefrom a one-shot greeter into a guided picker: theme, panel position, monospace font, "what's a sane home.nix to start with?". Runs once, persists "done" instate.json. - Plymouth theme variants per palette. Currently one Plymouth theme; could template per-palette so the boot splash matches the active theme.
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.
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
- Software-profile multi-select (Now).
- Richer disk metadata (Shipped).
- Form-factor → laptop preset (Now, depends on Pillar 5).
disko-golden.nixvariants for software-RAID and BTRFS-pool-as-root.- Pre-flight resume polish (Next).
- "What's installed?" summary screen on boot of a freshly-installed system, sourced from
state.json+nomarchy-system-scriptsintrospection. - Optional non-LUKS branch in the installer for users who explicitly opt out of FDE.
5. Pillar: Power, hardware, presets
- Laptop preset (Next): TLP, upower, brightness, lid, hypridle tuning.
- Desktop preset (Next): performance governor, no laptop UI (already filtered), ZFS hooks.
- Accessibility preset (Next).
- Gaming preset (Next).
- Vendor matchers in
installer/hardware-db.sh: Steam Deck, Surface, ROG Ally, Snapdragon X laptops. - Surface support behind
nomarchy.hardware.isSurface(Later). - Auto-detect dGPU presence and offer
programs.envycontrol-style switching for the hybrid case (already gated behindnomarchy.system.features.hybridGPU, but the wiring is minimal).
6. Pillar: Onboarding & docs
nomarchy-welcomefirst-run wizard (Next).docs/KEYBINDINGS.mdauto-generator (Shipped).docs/TROUBLESHOOTING.md(Next).docs/index.md(or just enrichREADME.md) soOPTIONS.md,STRUCTURE.md,MIGRATION.md,ROADMAP.md,SCRIPTS.md, andcreating-themes.mdare all one click from the front page.nomarchy-manual— orphaned reference today; either implement as a curatedxdg-opento the docs index, or delete.
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: Distro Branding
Nomarchy is moving away from being a "flavor" of Omarchy to its own distinct identity. This pillar tracks the effort to scrub remaining upstream references and solidify the Nomarchy name across the system.
- ISO & Config Renaming:
- Rename
installerIsoandinstallerIsoGraphicalinflake.nixtonomarchy-installerandnomarchy-live. - Update
hosts/nomarchy-installer.nixandhosts/nomarchy-live.nixinternal metadata.
- Rename
- Bootloader & Splash:
- Update Limine/systemd-boot entries to display "Nomarchy" instead of "NixOS".
- Scrub "Omarchy" from
themes/engine/plymouth/nomarchy.script. - Ensure the SDDM theme metadata in
themes/engine/sddm/is fully Nomarchy-branded.
- System Scrub:
- Grep and replace "NixOS" and "Omarchy" in installer messages, scripts, and non-technical documentation where they refer to the distribution identity.
- Update
/etc/os-releaseviaenvironment.etc."os-release"to ensureNAMEandPRETTY_NAMEreflect Nomarchy.
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-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).