From afdb928ed7f1b917364656d50cef5abf86cc1e08 Mon Sep 17 00:00:00 2001 From: Bernardo Magri Date: Sun, 14 Jun 2026 18:29:16 +0100 Subject: [PATCH] docs: split roadmap into docs/ROADMAP.md, reconcile README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The roadmap + known-issues had grown to ~280 lines, nearly half the README. Moved both into docs/ROADMAP.md (forward-looking plans + a log of shipped fixes) and left a short pointer, so the README is back to a focused entry point (572 -> 302 lines). Also fixed drift surfaced in the pass: - layout tree: add modules/nixos/power.nix, modules/home/{keybinds,keys, fastfetch}.nix and docs/ROADMAP.md, which were missing. - option table: add keys.enable, fastfetch.enable, system.snapper.enable (default false — the installer opts in) and system.greeter.autoLogin. OVERRIDES.md, TESTING.md and the downstream template README were checked and are accurate (.#default / .#me names and the 21-preset count match), so they're left as-is. Docs stay Markdown-in-repo — no docs site. Co-Authored-By: Claude Opus 4.8 --- README.md | 302 +++--------------------------------------------- docs/ROADMAP.md | 291 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+), 286 deletions(-) create mode 100644 docs/ROADMAP.md diff --git a/README.md b/README.md index 3544db4..2848563 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,8 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. │ │ ├── default.nix # Hyprland session, Pipewire, greetd, fonts │ │ ├── options.nix # nomarchy.system.* toggles │ │ ├── plymouth.nix # boot splash, tinted from the JSON -│ │ └── file-manager.nix # Thunar GUI + gvfs/tumbler/udisks2 +│ │ ├── file-manager.nix # Thunar GUI + gvfs/tumbler/udisks2 +│ │ └── power.nix # power-profiles-daemon/TLP, thermald, charge limit │ └── home/ # the distro, user side │ ├── default.nix # entry point │ ├── options.nix # nomarchy.* option surface @@ -57,12 +58,15 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. │ ├── waybar.nix │ ├── ghostty.nix │ ├── btop.nix -│ ├── rofi.nix # launcher + nomarchy-menu (power, clip) +│ ├── rofi.nix # launcher + nomarchy-menu (calc, emoji, clip…) +│ ├── keybinds.nix # single source: Hyprland binds + SUPER+? sheet │ ├── swaync.nix # notifications, same JSON │ ├── idle.nix # hyprlock + hypridle, same JSON │ ├── yazi.nix # flagship TUI file manager + plugins │ ├── osd.nix # swayosd volume/brightness OSD -│ └── shell.nix # zsh + starship + bat/eza/zoxide +│ ├── shell.nix # zsh + starship + bat/eza/zoxide +│ ├── keys.nix # gpg-agent fronting SSH, pinentry-qt +│ └── fastfetch.nix # themed Nomarchy logo + system info ├── hosts/ │ ├── default/ # reference machine (thin: boot, user, hostname) │ └── live.nix # bootable live ISO (try the distro, no install) @@ -72,6 +76,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. ├── templates/downstream/ # `nix flake init -t` starter for users ├── docs/TESTING.md # how to verify changes (incl. AI-agent rules) ├── docs/OVERRIDES.md # how downstream users override defaults +├── docs/ROADMAP.md # forward-looking plans + shipped-fixes log └── tools/ # maintainer-only ├── import-palettes.py # converts old-distro themes → JSON + assets ├── test-live-iso.sh # build the ISO + boot it in QEMU @@ -194,12 +199,16 @@ examples: **[docs/OVERRIDES.md](docs/OVERRIDES.md)**. | `nomarchy.ghostty.enable` | `true` | Nomarchy's Ghostty | | `nomarchy.btop.enable` | `true` | btop with per-theme colors | | `nomarchy.stylix.enable` | `true` | GTK/Qt/cursor theming | +| `nomarchy.fastfetch.enable` | `true` | fastfetch fronted by the themed Nomarchy logo | +| `nomarchy.keys.enable` | `true` | gpg-agent fronting SSH + pinentry-qt | | `nomarchy.themesDir` | Nomarchy's `themes/` | Where per-theme app overrides are probed | | `nomarchy.system.plymouth.enable` | `true` | Branded boot splash, background from the theme JSON (recolors on system rebuilds) | | `nomarchy.system.fileManager.enable` | `true` | Thunar GUI + gvfs/tumbler/udisks2 (the "open folder" handler) | | `nomarchy.system.greeter.enable` | `true` | greetd/tuigreet | +| `nomarchy.system.greeter.autoLogin` | `null` | Auto-login this user into Hyprland (installer sets it on LUKS machines) | | `nomarchy.system.audio.enable` | `true` | Pipewire stack | | `nomarchy.system.bluetooth.enable` | `true` | Bluetooth + blueman | +| `nomarchy.system.snapper.enable` | `false` | Hourly/daily BTRFS timeline snapshots + `nixos-rebuild-snap` (installer enables it; no-op unless root is BTRFS) | | `nomarchy.system.power.enable` | `true` | Active power management (see below) | | `nomarchy.system.power.backend` | `"ppd"` | `"ppd"` (power-profiles-daemon + menu/Waybar switcher) or `"tlp"` (deeper battery tuning, no switcher) — mutually exclusive | | `nomarchy.system.power.laptop` | `false` | Marks a laptop, gating battery-only features; the installer sets it when a battery is present | @@ -286,287 +295,8 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot. - **Importing more old-distro palettes:** `tools/import-palettes.py themes/`. -## Roadmap -- **Menu system** (apps launcher + theme switching + system actions), built - on rofi 2.0 (native Wayland on 26.05) — its `.rasi` theme 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//rofi.rasi` whole-swap) and the - `nomarchy-menu` dispatcher: 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 is `rofi -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 via `npx - @anthropic-ai/claude-code@latest` rather than the nixpkgs package, which - lags model releases — `nodejs` is bundled for npx; REPL stays open) - - ✓ keybindings cheatsheet: `modules/home/keybinds.nix` is the **single - source** for both the Hyprland binds and the SUPER+? rofi list, so they - can't drift; `nomarchy-menu keybinds` renders the padded two-column - sheet (generated/mouse binds carried in its `extra` rows) - - ✓ shipped binds: `SUPER+Space` → `rofi -show drun` (quick launch) · - `SUPER+M` → `nomarchy-menu` (main menu) · `SUPER+?` → the cheatsheet; - `SUPER+D` stays `-show drun` - - launcher icons: ✓ `show-icons` on, 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) -- ✓ **Menu modules from rofi plugins:** the old `calc` flow committed the - expression blind (result only in the *next* menu's `-mesg`) and `qalc -t` - misparsed 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's `nmtui`-in-terminal `network`), **rofi-rbw / - rofi-pass** (a secrets module — Bitwarden via rbw, or `pass` — pairs with - `keys.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.jsonc` whole-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//rofi.rasi` whole-swap - ships, and summer-day/night carry their legacy designs (inverted window, - green inputbar, yellow bottom-border). Remaining: author `.rasi` - identities 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-install` is single-disk UEFI — see `pkgs/nomarchy-install`) -- launch-or-focus UX scripts (swayosd volume/brightness OSD ships since v1: - `nomarchy.osd.*`, media keys drive `swayosd-client`, themed from the JSON) -- **Distro branding, round 2:** `distroName = "Nomarchy"` ships - (os-release `PRETTY_NAME`, systemd-boot entries, ISO menu label). - ✓ tuigreet greeting (`Welcome to `) and a branded `users.motd` - (doubling as a helper cheat sheet), both keyed off `distroName`. - ✓ `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.grubTheme` so UEFI boot matches the isolinux splash - (needs a full grub theme dir), and the `distroId` question (it changes - `DEFAULT_HOSTNAME` and upstream `isNixos` checks — 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 via `fonts.packages`, and the - summer-day/night menu buttons now use its `U+F000` glyph with - `font-family: Nomarchy` pinned 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 on - `nomarchy.theme.iconTheme` (the JSON's optional `icons` field, else - Papirus-Dark/Light by `mode`) and feeds both Stylix's `gtk.iconTheme` - (Thunar/GTK apps) and rofi's `show-icons`. Remaining (optional): per-theme - `icons` overrides 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, plus `lt`/`tree`. - `nomarchy.shell.enable`. (Deliberately did NOT alias grep→rg / find→fd: - their flags differ enough to surprise; `rg`/`fd` ship 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.nix` now 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_cmd` - also locked hyprlock, so the user typed a password twice. Fixed with a - `nomarchy-hibernate-unlock` systemd 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-agent` with - `enableSshSupport` fronts SSH, so a single `pinentry-qt` (native-Wayland, - Stylix-themed Qt) handles GPG and SSH passphrases alike. `SSH_AUTH_SOCK` - comes 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-level `SSH_AUTH_SOCK` export so GUI - clients launched outside a shell also see the agent. -- **Sanitize & organize the repo:** a housekeeping pass for consistency - and clarity. Candidate targets (scope still to be defined): prune - now-redundant config (e.g. the installer still writes - `console.useXkbConfig` / `boot.initrd.systemd.enable` into `system.nix`, - which are distro-wide defaults as of the LUKS-keymap fix); reconcile the - README option tables with the actual `nomarchy.*` surface; audit - comments/docs for drift against the code; and re-check that every file - still earns its place under the `modules`/`hosts`/`themes`/`pkgs`/`tools` - rule of thumb. -- **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 live `nomarchy.*` surface (snapper and others are - missing); a pass over `docs/OVERRIDES.md` + `docs/TESTING.md` and the - `templates/downstream/README.md` for 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 "only `services.upower` for Waybar reporting" baseline: - - ✓ **profiles:** `power-profiles-daemon` ships by default (the upstream- - aligned choice — power-saver/balanced/performance via `powerprofilesctl`, - switched through polkit so no root prompt). A `power-profile` menu module - (in the SUPER+M picker) and the first Waybar `custom/*` 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:** `thermald` behind `power.thermal.enable`; the installer - turns it on for a `GenuineIntel` CPU. - - ✓ **longevity:** `power.batteryChargeLimit` (e.g. 80) — a backend- - independent sysfs oneshot writes `charge_control_end_threshold`. Off by - default; the installer scaffolds it commented-out on laptops. - - ✓ **installer:** writes `power.laptop = true` (battery probe) and - `power.thermal.enable` (Intel) into the generated `system.nix`. - - ✓ **idle cohesion:** `modules/home/idle.nix` now suspends only on - battery (and sooner — 15 min vs the old fixed 30), gating the hypridle - suspend listener on a `nomarchy-on-ac` probe 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. -- **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..enable` toggle 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 +## Roadmap & known issues - 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 to `nomarchy.apps.*` (opt-out suite). Unfree entries are - already covered (`allowUnfree = true`). -- **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.monitors` vs plain Hyprland `monitor` lists). -- **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.layout` today. Support a list of layouts with a toggle - bind (`hyprctl switchxkblayout` / xkb `grp:` 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:** a swaync DND toggle (`swaync-client -dn`) wired into - the menu and a Waybar indicator, to silence notifications for - presentations/focus. -- **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' - `group` field required, so `[[plugin.prepend_fetchers]]` failed to parse - and yazi fell back to presets. Fixed by adding `group = "git"` to both - git fetcher entries in `modules/home/yazi.nix` (the git plugin's - `setup()` 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 in `cmd_duration`, - which was configured but never referenced in `format`. -- ✓ **xfce deprecation warnings:** moved `xfce.exo` → `pkgs.xfce4-exo` and - the three Thunar plugins to their new top-level names in - `modules/nixos/file-manager.nix`; the eval warnings are gone. -- ✓ **Rofi function keybindings:** direct `SUPER+CTRL+` binds jump - straight to each `nomarchy-menu` module — V clipboard · C calc · W web · - F files · N network · B bluetooth · S capture · A ask — added to - `modules/home/keybinds.nix`, so they also show in the SUPER+? cheatsheet. -- ✓ **Enable nix-ld by default:** `programs.nix-ld.enable` is 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→accentAlt` gradient 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-resolved `border` - field (`{active, inactive}`) to the theme schema (`theme.nix`), consumed - solid in `hyprland.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 modern `persistent-workspaces` (hyphen), which - Waybar honours → all 10 rendered as phantoms. Dropped the block from - `themes/summer-{day,night}/waybar.jsonc`; the other themes use the - generated `waybar.nix`, which never had it, so they already match. -- ✓ **GTK/Qt ignore the theme's light/dark mode:** Stylix set `polarity` - but not the `org.freedesktop.appearance color-scheme` that GTK4/libadwaita - and Qt6 read via the portal, so a light theme could still render apps - dark. `stylix.nix` now sets `dconf` `org/gnome/desktop/interface - color-scheme` = `prefer-light`/`prefer-dark` from `t.mode` - (xdg-desktop-portal-gtk already ships, and `programs.dconf` is on - system-side), so libadwaita/Qt follow the palette. Needs a live session - to confirm the portal picks it up for all apps. +See **[docs/ROADMAP.md](docs/ROADMAP.md)** — forward-looking plans plus the +log of shipped fixes. Kept out of the README so this stays a focused entry +point. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md new file mode 100644 index 0000000..ad78800 --- /dev/null +++ b/docs/ROADMAP.md @@ -0,0 +1,291 @@ +# 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 `.rasi` theme 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//rofi.rasi` whole-swap) and the + `nomarchy-menu` dispatcher: 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 is `rofi -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 via `npx + @anthropic-ai/claude-code@latest` rather than the nixpkgs package, which + lags model releases — `nodejs` is bundled for npx; REPL stays open) + - ✓ keybindings cheatsheet: `modules/home/keybinds.nix` is the **single + source** for both the Hyprland binds and the SUPER+? rofi list, so they + can't drift; `nomarchy-menu keybinds` renders the padded two-column + sheet (generated/mouse binds carried in its `extra` rows) + - ✓ shipped binds: `SUPER+Space` → `rofi -show drun` (quick launch) · + `SUPER+M` → `nomarchy-menu` (main menu) · `SUPER+?` → the cheatsheet; + `SUPER+D` stays `-show drun` + - launcher icons: ✓ `show-icons` on, 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) +- ✓ **Menu modules from rofi plugins:** the old `calc` flow committed the + expression blind (result only in the *next* menu's `-mesg`) and `qalc -t` + misparsed 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's `nmtui`-in-terminal `network`), **rofi-rbw / + rofi-pass** (a secrets module — Bitwarden via rbw, or `pass` — pairs with + `keys.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.jsonc` whole-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//rofi.rasi` whole-swap + ships, and summer-day/night carry their legacy designs (inverted window, + green inputbar, yellow bottom-border). Remaining: author `.rasi` + identities 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-install` is single-disk UEFI — see `pkgs/nomarchy-install`) +- launch-or-focus UX scripts (swayosd volume/brightness OSD ships since v1: + `nomarchy.osd.*`, media keys drive `swayosd-client`, themed from the JSON) +- **Distro branding, round 2:** `distroName = "Nomarchy"` ships + (os-release `PRETTY_NAME`, systemd-boot entries, ISO menu label). + ✓ tuigreet greeting (`Welcome to `) and a branded `users.motd` + (doubling as a helper cheat sheet), both keyed off `distroName`. + ✓ `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.grubTheme` so UEFI boot matches the isolinux splash + (needs a full grub theme dir), and the `distroId` question (it changes + `DEFAULT_HOSTNAME` and upstream `isNixos` checks — 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 via `fonts.packages`, and the + summer-day/night menu buttons now use its `U+F000` glyph with + `font-family: Nomarchy` pinned 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 on + `nomarchy.theme.iconTheme` (the JSON's optional `icons` field, else + Papirus-Dark/Light by `mode`) and feeds both Stylix's `gtk.iconTheme` + (Thunar/GTK apps) and rofi's `show-icons`. Remaining (optional): per-theme + `icons` overrides 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, plus `lt`/`tree`. + `nomarchy.shell.enable`. (Deliberately did NOT alias grep→rg / find→fd: + their flags differ enough to surprise; `rg`/`fd` ship 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.nix` now 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_cmd` + also locked hyprlock, so the user typed a password twice. Fixed with a + `nomarchy-hibernate-unlock` systemd 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-agent` with + `enableSshSupport` fronts SSH, so a single `pinentry-qt` (native-Wayland, + Stylix-themed Qt) handles GPG and SSH passphrases alike. `SSH_AUTH_SOCK` + comes 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-level `SSH_AUTH_SOCK` export so GUI + clients launched outside a shell also see the agent. +- **Sanitize & organize the repo:** a housekeeping pass for consistency + and clarity. Candidate targets (scope still to be defined): prune + now-redundant config (e.g. the installer still writes + `console.useXkbConfig` / `boot.initrd.systemd.enable` into `system.nix`, + which are distro-wide defaults as of the LUKS-keymap fix); reconcile the + README option tables with the actual `nomarchy.*` surface; audit + comments/docs for drift against the code; and re-check that every file + still earns its place under the `modules`/`hosts`/`themes`/`pkgs`/`tools` + rule of thumb. +- **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 live `nomarchy.*` surface (snapper and others are + missing); a pass over `docs/OVERRIDES.md` + `docs/TESTING.md` and the + `templates/downstream/README.md` for 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 "only `services.upower` for Waybar reporting" baseline: + - ✓ **profiles:** `power-profiles-daemon` ships by default (the upstream- + aligned choice — power-saver/balanced/performance via `powerprofilesctl`, + switched through polkit so no root prompt). A `power-profile` menu module + (in the SUPER+M picker) and the first Waybar `custom/*` 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:** `thermald` behind `power.thermal.enable`; the installer + turns it on for a `GenuineIntel` CPU. + - ✓ **longevity:** `power.batteryChargeLimit` (e.g. 80) — a backend- + independent sysfs oneshot writes `charge_control_end_threshold`. Off by + default; the installer scaffolds it commented-out on laptops. + - ✓ **installer:** writes `power.laptop = true` (battery probe) and + `power.thermal.enable` (Intel) into the generated `system.nix`. + - ✓ **idle cohesion:** `modules/home/idle.nix` now suspends only on + battery (and sooner — 15 min vs the old fixed 30), gating the hypridle + suspend listener on a `nomarchy-on-ac` probe 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. +- **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..enable` toggle 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 to `nomarchy.apps.*` (opt-out suite). Unfree entries are + already covered (`allowUnfree = true`). +- **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.monitors` vs plain Hyprland `monitor` lists). +- **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.layout` today. Support a list of layouts with a toggle + bind (`hyprctl switchxkblayout` / xkb `grp:` 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:** a swaync DND toggle (`swaync-client -dn`) wired into + the menu and a Waybar indicator, to silence notifications for + presentations/focus. +- **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' + `group` field required, so `[[plugin.prepend_fetchers]]` failed to parse + and yazi fell back to presets. Fixed by adding `group = "git"` to both + git fetcher entries in `modules/home/yazi.nix` (the git plugin's + `setup()` 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 in `cmd_duration`, + which was configured but never referenced in `format`. +- ✓ **xfce deprecation warnings:** moved `xfce.exo` → `pkgs.xfce4-exo` and + the three Thunar plugins to their new top-level names in + `modules/nixos/file-manager.nix`; the eval warnings are gone. +- ✓ **Rofi function keybindings:** direct `SUPER+CTRL+` binds jump + straight to each `nomarchy-menu` module — V clipboard · C calc · W web · + F files · N network · B bluetooth · S capture · A ask — added to + `modules/home/keybinds.nix`, so they also show in the SUPER+? cheatsheet. +- ✓ **Enable nix-ld by default:** `programs.nix-ld.enable` is 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→accentAlt` gradient 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-resolved `border` + field (`{active, inactive}`) to the theme schema (`theme.nix`), consumed + solid in `hyprland.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 modern `persistent-workspaces` (hyphen), which + Waybar honours → all 10 rendered as phantoms. Dropped the block from + `themes/summer-{day,night}/waybar.jsonc`; the other themes use the + generated `waybar.nix`, which never had it, so they already match. +- ✓ **GTK/Qt ignore the theme's light/dark mode:** Stylix set `polarity` + but not the `org.freedesktop.appearance color-scheme` that GTK4/libadwaita + and Qt6 read via the portal, so a light theme could still render apps + dark. `stylix.nix` now sets `dconf` `org/gnome/desktop/interface + color-scheme` = `prefer-light`/`prefer-dark` from `t.mode` + (xdg-desktop-portal-gtk already ships, and `programs.dconf` is on + system-side), so libadwaita/Qt follow the palette. Needs a live session + to confirm the portal picks it up for all apps.