ROADMAP.md is the durable mid-term plan: vision, guardrails, Now/Next/ Later board, and seven pillars (audit, installer, power/presets, onboarding/docs, test/CI/release, process). SCRIPTS.md is the scaffolding for the Pillar 3 script & menu audit — methodology, generator commands, and a snapshot of currently orphaned callers. The two open items in TODO.md (software-profile multi-select, richer disk metadata) move into the roadmap's Now column; the rest of TODO.md was already shipped, so the file is removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
12 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 MIGRATION.md.
1. Vision & guardrails
Nomarchy is a NixOS-based distribution that gives you the Omarchy 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)
- Software-profile multi-select in the installer. Carryover from the old TODO. Add a
gum choose --no-limitstep ininstaller/install.sh(between hardware and impermanence) for opt-in profiles (Dev, Gaming, Office, Media, …). Each profile maps to a list ofhome.packagesand optionalnomarchy.system.*toggles emitted into the generatedhome.nix/system.nix. - Richer disk metadata. Carryover from the old TODO. Replace the bare
lsblkline inselect_diskwithlsblk -O -Jparsed viajq, surfacing vendor, model, serial, and size in the picker. - Menu cleanup of orphaned references. Walk
features/scripts/utils/nomarchy-menu(379 lines, 23 submenus) and either wire each menu item to a real script or replace thecasearm with a stubbednotify-senduntil the script is ported. See Pillar 3 below. - Form-factor → laptop preset auto-enable. When the installer writes
nomarchy.system.formFactor = "laptop", also flip on a yet-to-be-built laptop preset (TLP, brightness keys, lid handling). The option exists; the preset module doesn't. docs/KEYBINDINGS.md. Auto-generate from thebindd =lines incore/home/config/nomarchy/default/hypr/bindings/*.confandfeatures/desktop/hyprland/config/bindings.confso the README's keybinding table stops drifting from the source of truth.
Next (bigger lifts that build on Now)
- Laptop preset module (
core/system/laptop.nix). Gated onformFactor = "laptop". Wires TLP defaults,services.upower,services.thermaldwhere applicable, brightness key handlers, and a sane logind lid-switch policy that defers tonomarchy.system.hibernation.enable. - Desktop preset module. CPU governor
performanceby default, no battery widget (already done), ZFS-friendly defaults for users who later add a pool. - Accessibility preset. Larger cursor, slower key-repeat defaults,
services.orca, screen reader keybinding, high-contrast theme variant. - Gaming preset.
programs.steam.enable,programs.gamemode.enable,services.flatpak.enablewith a curated remote, and a Hyprland window-rule to fullscreen Steam-launched apps. - 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.
docs/TROUBLESHOOTING.md. The five most common rebuild errors (option ... already declared,attribute ... missing, Stylix target conflicts, home-manager backupFileExtension churn, impermanence path missing) with copy-paste fixes.- Installer pre-flight resume polish. If the user Ctrl-Cs mid-install and runs
--resume, re-show the review screen before re-prompting for any unsaved fields.
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, buildinstallerIso,installerIsoGraphical,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 (Now).
- 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 (Now).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. 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-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;MIGRATION.mdlinked fromREADME.md(3cb012b,6ef28f0).