docs: split roadmap into docs/ROADMAP.md, reconcile README
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 <noreply@anthropic.com>
This commit is contained in:
302
README.md
302
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
|
│ │ ├── default.nix # Hyprland session, Pipewire, greetd, fonts
|
||||||
│ │ ├── options.nix # nomarchy.system.* toggles
|
│ │ ├── options.nix # nomarchy.system.* toggles
|
||||||
│ │ ├── plymouth.nix # boot splash, tinted from the JSON
|
│ │ ├── 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
|
│ └── home/ # the distro, user side
|
||||||
│ ├── default.nix # entry point
|
│ ├── default.nix # entry point
|
||||||
│ ├── options.nix # nomarchy.* option surface
|
│ ├── options.nix # nomarchy.* option surface
|
||||||
@@ -57,12 +58,15 @@ Flat on purpose. Two module trees, one options file each, no hidden layers.
|
|||||||
│ ├── waybar.nix
|
│ ├── waybar.nix
|
||||||
│ ├── ghostty.nix
|
│ ├── ghostty.nix
|
||||||
│ ├── btop.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
|
│ ├── swaync.nix # notifications, same JSON
|
||||||
│ ├── idle.nix # hyprlock + hypridle, same JSON
|
│ ├── idle.nix # hyprlock + hypridle, same JSON
|
||||||
│ ├── yazi.nix # flagship TUI file manager + plugins
|
│ ├── yazi.nix # flagship TUI file manager + plugins
|
||||||
│ ├── osd.nix # swayosd volume/brightness OSD
|
│ ├── 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/
|
├── hosts/
|
||||||
│ ├── default/ # reference machine (thin: boot, user, hostname)
|
│ ├── default/ # reference machine (thin: boot, user, hostname)
|
||||||
│ └── live.nix # bootable live ISO (try the distro, no install)
|
│ └── 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
|
├── templates/downstream/ # `nix flake init -t` starter for users
|
||||||
├── docs/TESTING.md # how to verify changes (incl. AI-agent rules)
|
├── docs/TESTING.md # how to verify changes (incl. AI-agent rules)
|
||||||
├── docs/OVERRIDES.md # how downstream users override defaults
|
├── docs/OVERRIDES.md # how downstream users override defaults
|
||||||
|
├── docs/ROADMAP.md # forward-looking plans + shipped-fixes log
|
||||||
└── tools/ # maintainer-only
|
└── tools/ # maintainer-only
|
||||||
├── import-palettes.py # converts old-distro themes → JSON + assets
|
├── import-palettes.py # converts old-distro themes → JSON + assets
|
||||||
├── test-live-iso.sh # build the ISO + boot it in QEMU
|
├── 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.ghostty.enable` | `true` | Nomarchy's Ghostty |
|
||||||
| `nomarchy.btop.enable` | `true` | btop with per-theme colors |
|
| `nomarchy.btop.enable` | `true` | btop with per-theme colors |
|
||||||
| `nomarchy.stylix.enable` | `true` | GTK/Qt/cursor theming |
|
| `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.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.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.fileManager.enable` | `true` | Thunar GUI + gvfs/tumbler/udisks2 (the "open folder" handler) |
|
||||||
| `nomarchy.system.greeter.enable` | `true` | greetd/tuigreet |
|
| `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.audio.enable` | `true` | Pipewire stack |
|
||||||
| `nomarchy.system.bluetooth.enable` | `true` | Bluetooth + blueman |
|
| `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.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.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 |
|
| `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:**
|
- **Importing more old-distro palettes:**
|
||||||
`tools/import-palettes.py <palettes-dir> themes/`.
|
`tools/import-palettes.py <palettes-dir> themes/`.
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap & known issues
|
||||||
- **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/<slug>/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/<slug>/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 <distroName>`) 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.<name>.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
|
See **[docs/ROADMAP.md](docs/ROADMAP.md)** — forward-looking plans plus the
|
||||||
surface or split (`nomarchy.services.*` system-side vs home-side packages);
|
log of shipped fixes. Kept out of the README so this stays a focused entry
|
||||||
and how it relates to `nomarchy.apps.*` (opt-out suite). Unfree entries are
|
point.
|
||||||
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+<mnemonic>` 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.
|
|
||||||
|
|||||||
291
docs/ROADMAP.md
Normal file
291
docs/ROADMAP.md
Normal file
@@ -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/<slug>/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/<slug>/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 <distroName>`) 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.<name>.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+<mnemonic>` 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.
|
||||||
Reference in New Issue
Block a user