diff --git a/README.md b/README.md index 0cc4a75..0260aab 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. ├── flake.nix # inputs + the downstream API (exports below) ├── lib.nix # nomarchy.lib.mkFlake — one-call downstream wrapper ├── theme-state.json # ★ THE single source of truth (git-tracked!) -├── themes/ # 21 presets: .json + optional / assets +├── themes/ # 24 presets: .json + optional / assets │ ├── nord.json # palette (required, works alone) │ └── nord/ # assets (optional, fixed filenames) │ ├── backgrounds/ # wallpapers (auto-picked, SUPER+SHIFT+T cycles) @@ -62,6 +62,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. │ ├── keybinds.nix # single source: Hyprland binds + SUPER+? sheet │ ├── swaync.nix # notifications, same JSON │ ├── idle.nix # hyprlock + hypridle, same JSON +│ ├── battery-notify.nix # low-battery toasts at the bar's thresholds │ ├── yazi.nix # flagship TUI file manager + plugins │ ├── osd.nix # swayosd volume/brightness OSD │ ├── shell.nix # zsh + starship + bat/eza/zoxide @@ -72,7 +73,10 @@ Flat on purpose. Two module trees, one options file each, no hidden layers. │ └── live.nix # bootable live ISO (try the distro, no install) ├── pkgs/ │ ├── nomarchy-theme-sync/ # state writer + rebuild dispatcher (Python) -│ └── nomarchy-install/ # live-ISO installer (gum + disko + mkFlake) +│ ├── nomarchy-install/ # live-ISO installer (gum + disko + mkFlake) +│ ├── nomarchy-doctor/ # read-only health sheet, one command per failure +│ ├── nomarchy-control-center/ # TUI settings front-end over nomarchy-theme-sync (gum) +│ └── nomarchy-battery-notify/ # low-battery toast watcher backing battery-notify.nix ├── templates/downstream/ # machine flake SoT (`flake init` + installer copy/patch) ├── docs/ # human docs — map: docs/README.md │ ├── VISION.md # product themes toward v1.0 (not a queue) @@ -141,6 +145,10 @@ files), the two first rebuilds, and landing the checkout at `~/.nomarchy` so the theme CLI finds it. (The installer does all of this for you.) +Already running NixOS on this machine? No reinstall needed — adopt +Nomarchy in place, reusing your existing `hardware-configuration.nix`: +**[docs/MIGRATION.md](docs/MIGRATION.md)**. + You own two files day-to-day: `system.nix` and `home.nix` (plus `theme-state.json`, written by the CLI). Your `flake.nix` is set up once — later by the installer — and never hand-edited; it's a single call: @@ -219,7 +227,7 @@ two tables below are split along exactly that line. | `nomarchy.rofi.enable` | `true` | Themed rofi launcher + `nomarchy-menu` dispatcher | | `nomarchy.swaync.enable` | `true` | swaync notifications, themed | | `nomarchy.batteryNotify.enable` | `true` | Low-battery toasts at the bar's thresholds — 25% low, 10% critical (stays up until dismissed); silent no-op on machines without a battery | -| `nomarchy.idle.enable` | `true` | hyprlock + hypridle (idle lock 5 min, display off 10, suspend 30) | +| `nomarchy.idle.enable` | `true` | hyprlock + hypridle (idle lock 5 min, display off 10, suspend 15 min — battery-only) | | `nomarchy.yazi.enable` | `true` | yazi TUI file manager, themed + curated plugins | | `nomarchy.osd.enable` | `true` | swayosd on-screen display for volume/brightness/mute | | `nomarchy.shell.enable` | `true` | zsh + starship prompt + bat/eza/zoxide (zsh is the default login shell) | @@ -237,6 +245,14 @@ two tables below are split along exactly that line. | `nomarchy.themesDir` | Nomarchy's `themes/` | Where per-theme app overrides are probed | | `nomarchy.package` | overlay's `nomarchy-theme-sync` | The theme/state tool package, overridable if you fork it | +**Always-on, no toggle by design:** `services.cliphist`, `services.udiskie` +(automount + safe-removal toasts) and `services.easyeffects` (mic noise +cancellation) ship unconditionally — small, low-risk pieces with no +Nomarchy-specific config behind them (the toggle-vs-package rule in +`agent/CONVENTIONS.md`). Disable one from `home.nix` with the plain HM +option, e.g. `services.easyeffects.enable = lib.mkForce false;` — see +**[docs/OVERRIDES.md](docs/OVERRIDES.md)**. + **`system.nix`** (NixOS — the machine): | Option | Default | Purpose | @@ -264,7 +280,9 @@ two tables below are split along exactly that line. | `nomarchy.hardware.npu.enable` | `false` | Opt-in/experimental: load the on-die NPU driver (`amdxdna`/`intel_vpu`); userspace runtime is BYO | | `nomarchy.hardware.latestKernel` | `false` | Opt-in: ship `linuxPackages_latest` instead of the default kernel — for very new hardware whose drivers landed recently | | `nomarchy.hardware.camera.hideIrSensor` | `false` | Hide a dual-sensor webcam's IR node from PipeWire so apps only ever see the colour camera (the "second, dark Integrated Camera"); installer-set on a paired RGB+IR webcam. `/dev/video*` stays open, so Howdy-style face unlock still works; `.irMatch` overrides the IR-name regex | -| `nomarchy.services.tailscale.enable` | `false` | Opt-in: Tailscale mesh VPN (then `sudo tailscale up`) | +| `nomarchy.hardware.i2c.enable` | `false` | I2C devices support — access to `/dev/i2c-*` (RGB controllers, sensors, DDC/CI monitor control) | +| `nomarchy.hardware.i2c.ddcci` | `false` (distro default: **`true`**) | the ddcci-driver kernel module, exposing external monitors as standard backlight devices via DDC/CI so brightness keys and swayosd natively control them | +| `nomarchy.services.tailscale.enable` | `false` | Opt-in: Tailscale mesh VPN — the login user is made the operator, so `tailscale up/down/set` and the System › VPN menu work without sudo | | `nomarchy.services.syncthing.enable` | `false` | Opt-in: Syncthing file sync as the login user (GUI at `127.0.0.1:8384`) | | `nomarchy.services.podman.enable` | `false` | Opt-in: rootless Podman (`docker` aliased to it) | | `nomarchy.services.flatpak.enable` | `false` | Opt-in: Flatpak + the Flathub remote | @@ -365,15 +383,15 @@ per theme — a single place to look, unlike the old distro's split: | `waybar.jsonc` | whole-swap for the bar *layout* (must be plain JSON) | | `rofi.rasi` | **whole-swap**: replaces the generated launcher/menu theme entirely | -Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord, -retro-82, summer-day, summer-night). Custom user themes can live in +Five themes ship a `waybar.css` identity (summer-day, summer-night, +executive-slate, boreal, neon-glass). Custom user themes can live in `$NOMARCHY_PATH/themes/` (preset lookup) and `nomarchy.themesDir` (eval-time asset probe). ## 5. Day-to-day ```sh -nomarchy-theme-sync list # 21 presets (nord, gruvbox, rose-pine, …) +nomarchy-theme-sync list # 24 presets (nord, gruvbox, rose-pine, …) nomarchy-theme-sync apply kanagawa # whole desktop, one generation (~a switch) nomarchy-theme-sync set ui.gapsOut 16 # tweak one knob (also a switch) nomarchy-theme-sync bg next # cycle wallpapers — instant, no rebuild diff --git a/agent/BACKLOG.md b/agent/BACKLOG.md index 68f3dbb..5747cb6 100644 --- a/agent/BACKLOG.md +++ b/agent/BACKLOG.md @@ -114,32 +114,6 @@ Next slice: on hardware, run `hyprctl clients` while each is open, read the real `class`, then append rules. Also revisit whether blueman/s-c-p actually float once seen (regex tolerance for the `.…-wrapped` form). -### 47. Docs + string factual-drift pass (promoted 2026-07-09) -Pure docs (V0) plus two `.nix` string fixes (V1: HM build). One pass or split: -- **README/docs drift:** theme count **21 → 24** (`README.md`, - `docs/TESTING.md`, `templates/downstream/README.md`); waybar whole-swap - list → summer-day/summer-night/executive-slate/boreal/neon-glass (drop the - catppuccin/lumon/nord/retro-82 stubs); idle table "suspend **30**" → - **15 min battery-only** (`idle.nix`); Tailscale row `sudo tailscale up` → - operator/no-sudo; `hosts/live.nix` header "No installer yet" → current; - CONVENTIONS parity list add **boreal**. -- **Secondary docs:** README layout tree add doctor/control-center/ - battery-notify; link `docs/MIGRATION.md` from README nav + fix its - placeholder flake-init URL; OVERRIDES.md screenshot pipe swappy → **satty**. -- **Document always-on home pieces:** easyeffects/udiskie/cliphist ship with - no toggle by design — a short README note + override pointer. -- **String fixes (V1):** keybind cheatsheet `desc = "Network (nmtui)"` → - networkmanager_dmenu (`keybinds.nix`); complete the `nomarchy-menu` usage - string (add doctor/controlcenter/rollback/firmware/…, `rofi.nix`). -Verify any documented command by running it. - -### 48. Document `nomarchy.hardware.i2c.*` — close checks.option-docs (promoted 2026-07-09) -`nomarchy.hardware.i2c.enable` and `.ddcci` (`modules/nixos/hardware.nix`) -have no README table rows → `checks.option-docs` is red. Add rows (+ note the -effective default: option default `false` but distro `mkDefault true` for -ddcci in `modules/nixos/default.nix`). Optional template opt-in comment. -V0 — `checks.option-docs` verifies (pure runCommand, no VM). - ### 49. Pure-contract `checks.*` batch — no VM (promoted 2026-07-09) Add pure runCommand checks (all V0): - Expand CI `py_compile` to **all** tracked `*.py` (compose-lock, tools/*, diff --git a/agent/CONVENTIONS.md b/agent/CONVENTIONS.md index c6e5542..9a8f3f1 100644 --- a/agent/CONVENTIONS.md +++ b/agent/CONVENTIONS.md @@ -45,8 +45,8 @@ those, it probably shouldn't exist. - **Waybar:** new indicators self-gate (hidden when irrelevant), use named `writeShellScriptBin`s on PATH (so static configs can exec them by bare name), and are added to **both** the generated `waybar.nix` - config **and** every `waybar.jsonc` whole-swap — summer-day, summer-night - and executive-slate (the parity rule). + config **and** every `waybar.jsonc` whole-swap — summer-day, summer-night, + executive-slate and boreal (the parity rule). - **Theming:** every new visual surface consumes the palette from the state JSON. There is no second renderer to keep in sync — add the key to the JSON, consume it in the module. diff --git a/agent/JOURNAL.md b/agent/JOURNAL.md index af18928..c656520 100644 --- a/agent/JOURNAL.md +++ b/agent/JOURNAL.md @@ -17,6 +17,24 @@ Template: --- +## 2026-07-09 — #47+#48 docs/string factual-drift pass (delegated, worktree) +- **Task:** NEXT #47 (docs + string drift) + #48 (i2c option-docs). Delegated + to a worktree sonnet agent, parallel with #46 VM + the #49 agent, no shared + files. +- **Did:** Agent fixed every drift after verifying each claim against code: + theme count 21→24 (README ×3, TESTING, template), waybar whole-swap list + (correctly split waybar.css=5 incl. neon-glass vs waybar.jsonc parity=4 + + boreal), idle 30→15min-battery-only, Tailscale sudo→operator, live.nix + header, MIGRATION link + URL, README layout tree (+doctor/CC/battery-notify), + OVERRIDES swappy→satty, always-on note; keybind nmtui→networkmanager_dmenu; + nomarchy-menu usage string (+doctor/firmware/controlcenter/rollback). Added + README i2c rows (#48). Reviewed the diff, cherry-picked onto main. +- **Verified:** V0 flake check green; `checks.option-docs` now **green** (85 + options, no stale rows) — closes #48; V1 HM generation builds (usage string + + keybind label confirmed in the built output). Re-run on main after cherry-pick. +- **Pending:** none — docs/config, fully verified at their tier. +- **Next suggestion:** land #49 (checks batch); then #50. + ## 2026-07-09 — Promote V0/V1 PROPOSED items → NEXT #47–50 (Bernardo-directed) - **Task:** Bernardo asked to bump the non-V2 PROPOSED items into NEXT (to feed parallel worktree agents that can't touch the VM). Triage is his call; diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md index c94b1d8..5b73432 100644 --- a/docs/MIGRATION.md +++ b/docs/MIGRATION.md @@ -88,7 +88,8 @@ before anything touches the running system. git clone https://git.bemagri.xyz/bernardo/nomarchy.git ~/nomarchy-migrate cd ~/nomarchy-migrate # Or start from the downstream template: -# nix flake init -t github:.../nomarchy (produces flake.nix/system.nix/home.nix/…) +# nix flake init -t "git+https://git.bemagri.xyz/bernardo/nomarchy.git?ref=v1" +# (produces flake.nix/system.nix/home.nix/…) ``` A Nomarchy downstream flake owns exactly five files. Assemble them: diff --git a/docs/OVERRIDES.md b/docs/OVERRIDES.md index ddd97a9..f56605b 100644 --- a/docs/OVERRIDES.md +++ b/docs/OVERRIDES.md @@ -66,7 +66,7 @@ autostarts run *alongside* the defaults: wayland.windowManager.hyprland.settings = { bind = [ "$mod, B, exec, firefox" - "$mod SHIFT, S, exec, grim -g \"$(slurp)\" - | swappy -f -" + "$mod SHIFT, S, exec, grim -g \"$(slurp)\" - | satty --filename -" ]; exec-once = [ "nm-applet --indicator" ]; }; diff --git a/docs/TESTING.md b/docs/TESTING.md index 2d5e43b..9dda5c5 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -69,7 +69,7 @@ Work through these in order; each one exercises a different layer. | 2 | Waybar shows at top, themed (blue accent on dark) | HM waybar module, palette baking | | 3 | `SUPER+Return` opens Ghostty with the default theme colors (Boreal) | terminal default, ANSI palette | | 4 | `btop` in the terminal is themed | per-theme asset baking | -| 5 | `nomarchy-theme-sync list` prints 21 presets | package, baked themes dir | +| 5 | `nomarchy-theme-sync list` prints 24 presets | package, baked themes dir | | 6 | `nomarchy-theme-sync apply gruvbox` → state written, `home-manager switch` runs, desktop re-themes, wallpaper changes | the whole engine: state write, pure eval, HM rebuild, wallpaper hook | | 7 | `SUPER+SHIFT+T` cycles wallpapers instantly (try `tokyo-night` for 4, or `boreal` for its set) | the runtime wallpaper path | | 8 | `nomarchy-theme-sync apply summer-night` → after the switch the bar has its own identity (light bar, different styling) | whole-swap waybar.css assets | diff --git a/hosts/live.nix b/hosts/live.nix index b66650f..78f4543 100644 --- a/hosts/live.nix +++ b/hosts/live.nix @@ -1,6 +1,7 @@ # Live ISO host — boot the full Nomarchy desktop from a USB stick or QEMU -# without touching the disk. No installer yet (see roadmap); this target -# exists to test the distro end-to-end on real hardware. +# without touching the disk. The live session bundles nomarchy-install +# (gum + disko + mkFlake) for a real install; this target also lets you +# test the distro end-to-end on real hardware before committing to disk. { lib, pkgs, username, nomarchySrc, ... }: let diff --git a/modules/home/keybinds.nix b/modules/home/keybinds.nix index 0b83658..eb43298 100644 --- a/modules/home/keybinds.nix +++ b/modules/home/keybinds.nix @@ -48,7 +48,7 @@ { mods = "$mod CTRL"; key = "W"; action = "exec, nomarchy-menu web"; desc = "Web search"; } { mods = "$mod CTRL"; key = "F"; action = "exec, nomarchy-menu files"; desc = "File search"; } { mods = "$mod CTRL"; key = "E"; action = "exec, nomarchy-menu emoji"; desc = "Emoji picker"; } - { mods = "$mod CTRL"; key = "N"; action = "exec, nomarchy-menu network"; desc = "Network (nmtui)"; } + { mods = "$mod CTRL"; key = "N"; action = "exec, nomarchy-menu network"; desc = "Network (networkmanager_dmenu)"; } { mods = "$mod CTRL"; key = "B"; action = "exec, nomarchy-menu bluetooth"; desc = "Bluetooth"; } { mods = "$mod CTRL"; key = "S"; action = "exec, nomarchy-menu capture"; desc = "Screenshot / capture"; } { mods = "$mod CTRL"; key = "P"; action = "exec, nomarchy-menu colorpicker"; desc = "Color picker (→ clipboard)"; } diff --git a/modules/home/rofi.nix b/modules/home/rofi.nix index 21e75db..a845c34 100644 --- a/modules/home/rofi.nix +++ b/modules/home/rofi.nix @@ -872,7 +872,7 @@ ${themeRows} esac ;; *) - echo "usage: nomarchy-menu [lookfeel|tools|system|power|power-profile|powermgmt|batterylimit|theme|clipboard|calc|files|emoji|web|network|bluetooth|audio|display|display-profile|printers|capture|colorpicker|keybinds|ask|dnd|nightlight|autotimezone|autocommit|vpn|snapshot]" >&2 + echo "usage: nomarchy-menu [lookfeel|tools|system|power|power-profile|powermgmt|batterylimit|theme|clipboard|calc|files|emoji|web|network|bluetooth|audio|display|display-profile|printers|capture|colorpicker|keybinds|ask|dnd|nightlight|autotimezone|autocommit|vpn|snapshot|doctor|firmware|controlcenter|rollback]" >&2 exit 64 ;; esac ''; diff --git a/templates/downstream/README.md b/templates/downstream/README.md index 2a4ee32..d20db63 100644 --- a/templates/downstream/README.md +++ b/templates/downstream/README.md @@ -25,7 +25,7 @@ keyboard, detected hardware, password hash, …). Keep commented opt-ins and Day-to-day: ```sh -nomarchy-theme-sync list # 21 shipped presets +nomarchy-theme-sync list # 24 shipped presets nomarchy-theme-sync apply gruvbox # writes state + home-manager switch nomarchy-theme-sync bg next # cycle wallpapers (instant, no rebuild) ```