The custom/powerprofile indicator is missing from the whole-swap summer themes (its exec uses Nix-built script paths that can't go in static JSON). Note the fix (promote the scripts to named bins on PATH) and the general "new module → also add to whole-swap themes" rule. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
20 KiB
Roadmap & changelog
Forward-looking plans, plus a running log of shipped fixes (the "Known issues & follow-ups" section). Split out of the README so that stays a focused entry point — what Nomarchy is, how to install it, and how to override it. Items marked ✓ are shipped.
Roadmap
-
Menu system (apps launcher + theme switching + system actions), built on rofi 2.0 (native Wayland on 26.05) — its
.rasitheme is baked from theme-state.json like every other app, with rich per-element styling:- ✓ shipped:
modules/home/rofi.nix(per-element theme generated from the palette,themes/<slug>/rofi.rasiwhole-swap) and thenomarchy-menudispatcher: root picker (no args) ·power(lock/logout/suspend/hibernate/reboot/shutdown, SUPER+X) ·theme(SUPER+T) ·clipboard(cliphist, SUPER+CTRL+V) ·calc(rofi-calc, live, SUPER+CTRL+C) ·files(fd → xdg-open, SUPER+CTRL+F) ·emoji(rofi-emoji, SUPER+CTRL+E) ·web(Google). SUPER+D isrofi -show drun. - ✓ shipped modules:
network(nmtui in$TERMINAL) ·bluetooth(blueman-manager) ·capture(grim/slurp submenu: region/full → clipboard/file, saved to~/Pictures/Screenshots) ·keybinds(the cheatsheet, see below) ·ask(free-text → claude CLI in a terminal; auths via OAuth, no API key; pulled fresh vianpx @anthropic-ai/claude-code@latestrather than the nixpkgs package, which lags model releases —nodejsis bundled for npx; REPL stays open) - ✓ keybindings cheatsheet:
modules/home/keybinds.nixis the single source for both the Hyprland binds and the SUPER+? rofi list, so they can't drift;nomarchy-menu keybindsrenders the padded two-column sheet (generated/mouse binds carried in itsextrarows) - ✓ shipped binds:
SUPER+Space→rofi -show drun(quick launch) ·SUPER+M→nomarchy-menu(main menu) ·SUPER+?→ the cheatsheet;SUPER+Dstays-show drun - launcher icons: ✓
show-iconson, drawing from the theme's icon set (Papirus, via the icon-themes work below) - decision record: resolves the old Walker/Lua question — no GTK4 launcher, no second theming pipeline; the dispatcher owns the menu structure, so the renderer stays swappable (we moved fuzzel → rofi 2.0 once mainline gained native Wayland, for its richer theming)
- ✓ shipped:
-
✓ Menu modules from rofi plugins: the old
calcflow committed the expression blind (result only in the next menu's-mesg) andqalc -tmisparsed common phrasings (15% of 200→rem(15, 1 B), the natural- language "of" tripping the CLI). Resolved by adopting purpose-built rofi modi (programs.rofi.plugins), all themed through the same.rasi:- calc → rofi-calc: live results as you type via libqalculate directly (dodging the qalc-CLI "of" bug), Enter copies, menu persists to chain calculations.
- emoji → rofi-emoji (new module, SUPER+CTRL+E): glyph picker, copies via the plugin's Wayland clipboard adapter.
- files stays the hand-rolled
fd→rofi -dmenu→ xdg-open fuzzy search: rofi-file-browser-extended was tried and dropped — its navigate-a-tree model felt worse than flat fuzzy-find for a quick launcher, and yazi (SUPER+E) already covers real browsing.
-
More menu modules from rofi tools: the script-based counterparts (run via
rofi -dmenu, like the hand-rolled modules), each a deliberate replacement of an existing flow: rofi-network-manager (a keyboard wifi/VPN picker vs today'snmtui-in-terminalnetwork), rofi-rbw / rofi-pass (a secrets module — Bitwarden via rbw, orpass— pairs withkeys.nix), and rofi-pulse-select (an audio sink/source switcher). Decide per-module whether it earns replacing the current path. -
Theme parity with legacy: summer-day/night now carry their legacy bar layouts as
waybar.jsoncwhole-swaps (adapted: dead legacy script modules dropped, Nerd-Fonts-v2 codepoints remapped to FontAwesome/v3, logo button opens nomarchy-menu); the other four identity themes are palette recolors and already match. Remaining: a visual pass over all six on the live ISO -
Per-theme rofi identity: the
themes/<slug>/rofi.rasiwhole-swap ships, and summer-day/night carry their legacy designs (inverted window, green inputbar, yellow bottom-border). Remaining: author.rasiidentities for the other four ported themes if/when they want one (the generated palette theme is the default and looks fine) -
Faster switches: move
backgrounds/out of the flake source (the 86 MB re-copy on every state write is the main eval tax), then pre-built theme variants if still needed -
Greeter (tuigreet/SDDM) theming from the same JSON (Plymouth ships since v1:
nomarchy.system.plymouth.*, background tinted from the state file) -
Installer round 2: multi-disk BTRFS RAID, impermanence, BIOS/legacy boot (v1
nomarchy-installis single-disk UEFI — seepkgs/nomarchy-install) -
launch-or-focus UX scripts (swayosd volume/brightness OSD ships since v1:
nomarchy.osd.*, media keys driveswayosd-client, themed from the JSON) -
Distro branding, round 2:
distroName = "Nomarchy"ships (os-releasePRETTY_NAME, systemd-boot entries, ISO menu label). ✓ tuigreet greeting (Welcome to <distroName>) and a brandedusers.motd(doubling as a helper cheat sheet), both keyed offdistroName. ✓isoImage.splashImage— the vendored vector logo (modules/nixos/branding/logo.svg, from legacy) recolored to the palette accent on the theme base, built at ISO-build time (hosts/live.nix). Remaining:isoImage.grubThemeso UEFI boot matches the isolinux splash (needs a full grub theme dir), and thedistroIdquestion (it changesDEFAULT_HOSTNAMEand upstreamisNixoschecks — needs a test pass; nixos-* CLI names stay regardless) -
✓ fastfetch branding:
modules/home/fastfetch.nix(nomarchy.fastfetch.enable) — the vendored vector logo, recolored to the palette accent and rendered to compact block-art via chafa at build time (tracks the theme), fronting a curated module list. Replaces the oversized legacy ASCII with a themed, sized logo. -
✓ Nomarchy logo font in Waybar: vendored
Nomarchy.ttf(modules/nixos/branding/), installed viafonts.packages, and the summer-day/night menu buttons now use itsU+F000glyph withfont-family: Nomarchypinned in their CSS (Nerd Fonts also occupy U+F000, so the pin is required). The other themes have no logo button. -
Quality-of-life command aliases: assemble a curated collection of shell aliases/abbreviations for common operations (git, nix, navigation, the nomarchy helpers, …), themed into the zsh shell experience (
modules/home/shell.nix). Decide scope and which to ship on by default. -
Theme-switch feedback: ✓ the "rebuilding…" notification is now persistent (timeout 0) and replaced in place by "applied ✓" / failure via a synchronous tag, so a multi-minute switch never reads as a failed selection. (An honest indeterminate indicator — HM gives no % — a literal progress widget would be cosmetic; revisit only if wanted.)
-
Icon themes: ✓ ships
papirus-icon-theme; the resolved name lives onnomarchy.theme.iconTheme(the JSON's optionaliconsfield, else Papirus-Dark/Light bymode) and feeds both Stylix'sgtk.iconTheme(Thunar/GTK apps) and rofi'sshow-icons. Remaining (optional): per-themeiconsoverrides for the presets, or shipping more icon packs. -
Nicer shell out of the box: ✓ zsh is the default login shell, with a starship prompt themed from the JSON, autosuggestions + syntax highlighting, and modern-CLI ergonomics —
cat→bat (theme "ansi", so it tracks the palette),ls→eza,cd→zoxide, pluslt/tree.nomarchy.shell.enable. (Deliberately did NOT alias grep→rg / find→fd: their flags differ enough to surprise;rg/fdship as themselves.) -
Default application suite: install a complete-workstation set (vscode, libreoffice, gimp, inkscape, texlive-full, …) behind a
nomarchy.apps.*option surface so each is individually opt-out for users who want a leaner machine. Watch closure size (texlive-full is multi-GB — likely default-off or a lighter scheme). -
✓ Plymouth logo contrast: the shipped art was a fixed navy that vanished on dark bases.
modules/nixos/plymouth.nixnow recolors every element from the palette at build time (flat fill, alpha kept): logo/lock/bullet → text, entry/progress-box → surface, progress-bar → accent. Reads on light and dark; follows the theme as of the last system rebuild (like the background tint). -
✓ Hibernate double-unlock: on resume from hibernate the LUKS passphrase already gates the machine, but hypridle's
before_sleep_cmdalso locked hyprlock, so the user typed a password twice. Fixed with anomarchy-hibernate-unlocksystemd unit (modules/nixos/default.nix) that dismisses hyprlock after a hibernate resume (WantedBy hibernate.target,After systemd-hibernate.service→ runs post-resume), gated on the disk being LUKS-encrypted. Suspend (and the RAM-resume phase of suspend-then-hibernate) keep locking — they have no passphrase gate. -
✓ Key agents & pinentry: ships
modules/home/keys.nix(nomarchy.keys.enable): one agent —services.gpg-agentwithenableSshSupportfronts SSH, so a singlepinentry-qt(native-Wayland, Stylix-themed Qt) handles GPG and SSH passphrases alike.SSH_AUTH_SOCKcomes from the agent's zsh integration; cache TTLs (30 min / 2 h) govern re-prompting. gnome-keyring stays the Secret Service (modern versions run no SSH agent, so no socket contention); screen lock doesn't flush the cache. Remaining (optional): a session-levelSSH_AUTH_SOCKexport so GUI clients launched outside a shell also see the agent. -
Sanitize & organize the repo: a housekeeping pass for consistency and clarity.
- ✓ pruned now-redundant config: the installer no longer writes
console.useXkbConfig/boot.initrd.systemd.enableintosystem.nix(distro-wide defaults since the LUKS-keymap fix), nor the offline-pin test fixture inflake.nix. - ✓ reconciled the README option tables with the live
nomarchy.*surface (added keys/fastfetch/snapper/greeter.autoLogin). - ✓ untracked
.claude/settings.local.json(machine-local) + gitignored. - ✓ branch/release model:
mainis the development default;v1is the release pointer downstreams pin (?ref=v1), advanced to main once a batch is tested — rolling, no tags. Broughtmaincurrent (it was a stale legacy-merge), and deleted the deadrefactor/wave/nixos-26.05branches (keptlegacyfor history). See the comment inflake.nix. - Remaining (optional): re-check that every file still earns its place
under the
modules/hosts/themes/pkgs/toolsrule of thumb.
- ✓ pruned now-redundant config: the installer no longer writes
-
Full docs review & restructure: a dedicated pass over all the prose, not just the code-adjacent cleanup the repo-sanitize item covers. The README has grown to ~540 lines with a ~200-line roadmap inline — the biggest single move is likely splitting the roadmap out (e.g.
ROADMAP.md/docs/) so the README stays a focused "what it is / how to install / how to override" entry point. Also: reconcile every option table against the livenomarchy.*surface (snapper and others are missing); a pass overdocs/OVERRIDES.md+docs/TESTING.mdand thetemplates/downstream/README.mdfor drift; check the install/first-run story reads cleanly end to end; and decide whether anything wants a real docs site vs. staying Markdown-in-repo. Pairs with the first-boot welcome and control-center items (shared "how do I…" surface). -
Laptop power / battery management: a real power story behind a
nomarchy.system.power.*surface (modules/nixos/power.nix), replacing the old "onlyservices.upowerfor Waybar reporting" baseline:- ✓ profiles:
power-profiles-daemonships by default (the upstream- aligned choice — power-saver/balanced/performance viapowerprofilesctl, switched through polkit so no root prompt). Apower-profilemenu module (in the SUPER+M picker) and the first Waybarcustom/*indicator (click to cycle) both self-gate on a battery being present + PPD running, so they hide on desktops and under TLP — no system→home wiring. TLP is the opt-in (backend = "tlp") for deeper battery tuning; the two are mutually exclusive (asserted). - ✓ thermal:
thermaldbehindpower.thermal.enable; the installer turns it on for aGenuineIntelCPU. - ✓ longevity:
power.batteryChargeLimit(e.g. 80) — a backend- independent sysfs oneshot writescharge_control_end_threshold. Off by default; the installer scaffolds it commented-out on laptops. - ✓ installer: writes
power.laptop = true(battery probe) andpower.thermal.enable(Intel) into the generatedsystem.nix. - ✓ idle cohesion:
modules/home/idle.nixnow suspends only on battery (and sooner — 15 min vs the old fixed 30), gating the hypridle suspend listener on anomarchy-on-acprobe so a plugged-in machine stays up mid-idle; lock/screen-off are unchanged on both sources. logind's lid handling is left at its defaults (suspend on lid close, ignore when docked) — an explicit "I'm done" that coheres with the idle behaviour. - Remaining: a boot-only→event-driven charge-limit re-apply (udev) if a firmware resets the threshold on unplug.
- Remaining: the
custom/powerprofileWaybar indicator only lands in the generated config — the summer-day/night whole-swapwaybar.jsoncdon't show it (the module's exec points at Nix-built script store paths, which can't go in static JSON). Fix by promotingpowerProfileStatus/CyclefromwriteShellScriptto namedwriteShellScriptBins on PATH, then reference them by bare name from both the generated config and the whole-swap themes (the same parity the DND bell now has). General pattern: any new generated-config module needs adding to the whole-swap themes too.
- ✓ profiles:
-
Opt-in services & integrations: the counterpart to the opt-out application suite above — heavier or more personal integrations shipped off by default, each a
nomarchy.services.<name>.enabletoggle a downstream flips on in one line. Keeps the base lean while making common additions trivial. Candidates by area:- cloud/sync: Nextcloud client; Syncthing (
services.syncthing) - local AI: LM Studio (
lmstudio); Ollama (services.ollama, optional GPU accel) — pairs with the menu's Ask-Claude philosophy - containers/VMs: Docker/Podman; libvirt + virt-manager
- networking: Tailscale (
services.tailscale); WireGuard - gaming/media: Steam (
programs.steam); OBS Studio - devices: printing (CUPS + Avahi); KDE Connect / phone integration; OpenRGB
- backup: restic/borg (
services.restic) - escape hatch: Flatpak (
services.flatpak) for apps outside nixpkgs
Decisions: the curated set; whether system services and GUI apps share one surface or split (
nomarchy.services.*system-side vs home-side packages); and how it relates tonomarchy.apps.*(opt-out suite). Unfree entries are already covered (allowUnfree = true). - cloud/sync: Nextcloud client; Syncthing (
-
Display / monitor management: today Hyprland just uses
monitor = ,preferred,auto,1(mkDefault). Add a real external-monitor/dock story: declarative per-output config, hotplug profiles (kanshi-style, or Hyprland's own monitor rules), and optionally a GUI arranger (nwg-displays writes Hyprland monitor config). Decide declarative-only vs GUI, and the option shape (nomarchy.monitorsvs plain Hyprlandmonitorlists). -
Night light / blue-light filter: schedulable colour-temperature shift via
hyprsunset(Hyprland-native; wlsunset/gammastep are alternatives) — sunset/sunrise or a fixed schedule, with a menu + Waybar toggle. -
Runtime keyboard-layout switching: the session layout is a single
nomarchy.keyboard.layouttoday. Support a list of layouts with a toggle bind (hyprctl switchxkblayout/ xkbgrp:options) and a Waybar indicator for the active layout. Natural follow-on to the LUKS-keymap work — keep the system (console/initrd) and session layouts in sync. -
✓ Do-Not-Disturb: swaync DND toggle wired into the menu (
nomarchy-menu dnd, in the picker, SUPER+CTRL+D) and a Waybar bell indicator (custom/notificationviaswaync-client -swb: shows the notification count + DND state, left-click toggles the panel, right-click toggles DND). Turning DND off confirms with a toast; turning it on is silent (notifications are suppressed — the bell-off glyph is the cue). -
Snapshot browse/restore UX: snapper already takes BTRFS timeline snapshots (
nomarchy.system.snapper); surface them from the desktop — a rofi menu (or btrfs-assistant) to browse/diff/restore and boot-from- snapshot — so rollback isn't CLI-only. -
Update awareness: updates are manual today (
sys-update/home-update); add a Waybar indicator / notification when flake inputs are stale or a new nixpkgs rev is available (optionally with a pending-change count). Augments, never replaces, the explicit rebuild flow. -
"nomarchy" control center: a single TUI/GUI front-end over the common toggles — theme, power profile, opt-in services, display, DND — built on the same
nomarchy-theme-sync/nomarchy.*surface the menu already uses. Plus a first-boot welcome that lands new installs in a guided "pick your theme / essentials" flow (ties into the branding work).
Known issues & follow-ups
- ✓ Yazi TOML parse error on startup: yazi 26.x made fetchers'
groupfield required, so[[plugin.prepend_fetchers]]failed to parse and yazi fell back to presets. Fixed by addinggroup = "git"to both git fetcher entries inmodules/home/yazi.nix(the git plugin'ssetup()only renders the linemode; the fetcher still needs registering). - ✓ Starship prompt styling: dropped the powerline look (the
[]separator glyph +bg:fills) for a flat prompt — bold-accent directory, warn git branch, subtext status/duration,❯character, all plain colored text (modules/home/shell.nix). Also wired incmd_duration, which was configured but never referenced informat. - ✓ xfce deprecation warnings: moved
xfce.exo→pkgs.xfce4-exoand the three Thunar plugins to their new top-level names inmodules/nixos/file-manager.nix; the eval warnings are gone. - ✓ Rofi function keybindings: direct
SUPER+CTRL+<mnemonic>binds jump straight to eachnomarchy-menumodule — V clipboard · C calc · W web · F files · N network · B bluetooth · S capture · A ask — added tomodules/home/keybinds.nix, so they also show in the SUPER+? cheatsheet. - ✓ Enable nix-ld by default:
programs.nix-ld.enableis on distro-wide (modules/nixos/default.nix), so prebuilt/foreign dynamically-linked binaries run out of the box. - ✓ Hyprland border colors off for some themes: the cause was v1
forcing an
accent→accentAltgradient on every theme; legacy used a solid border (accent for nord/retro-82/lumon, the text tone for kanagawa/summer-day/summer-night). Added a palette-resolvedborderfield ({active, inactive}) to the theme schema (theme.nix), consumed solid inhyprland.nix, and declared it in every preset so a switch always replaces it. All six identity themes now match legacy exactly. - ✓ Waybar shows non-existent workspaces: the v1 summer port "fixed"
legacy's deprecated
persistent_workspaces(underscore — silently ignored by current Waybar, so legacy only ever showed existing workspaces) into the modernpersistent-workspaces(hyphen), which Waybar honours → all 10 rendered as phantoms. Dropped the block fromthemes/summer-{day,night}/waybar.jsonc; the other themes use the generatedwaybar.nix, which never had it, so they already match. - ✓ GTK/Qt ignore the theme's light/dark mode: Stylix set
polaritybut not theorg.freedesktop.appearance color-schemethat GTK4/libadwaita and Qt6 read via the portal, so a light theme could still render apps dark.stylix.nixnow setsdconforg/gnome/desktop/interface color-scheme=prefer-light/prefer-darkfromt.mode(xdg-desktop-portal-gtk already ships, andprograms.dconfis on system-side), so libadwaita/Qt follow the palette. Needs a live session to confirm the portal picks it up for all apps.