docs: plan the hyprland desktop epic (spec, ADR, tasks)

Add the hyprland-desktop spec, ADR 0003 recording the compositor choice
over Sway/KDE/niri, and the task breakdown (0021-0030) that decomposes
the desktop into granular grouped modules. Record the corrected host GPU
facts (zeus is AMD, raichu the sole Nvidia machine) in CLAUDE.md.
This commit is contained in:
2026-07-22 07:35:51 -04:00
parent fc3380f8ce
commit f552269cb3
13 changed files with 418 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
---
spec: hyprland-desktop
---
## What to build
The tracer bullet for the whole desktop: a keyboard-driven Hyprland session that neogaia can log into and open a terminal in.
Create the `modules/desktop/` group with an explicit aggregator, guarded by its own `modules.desktop.enable`, that hand-lists and turns on each piece at default priority so a host enables the whole desktop with one flag yet can still override any single piece.
Namespace every desktop enable under one desktop group so a host's checklist gains one entry.
Place the tightly coupled Hyprland-native pieces (starting with the compositor) in a subdirectory within the group.
Wire Hyprland from nixpkgs: the NixOS program integration owns the session and polkit, home-manager owns the user configuration, and both share one Hyprland package so there is never a version split.
The session is launched through the universal Wayland session manager from the greeter.
Login is greetd with the tuigreet text greeter, mouse-free and lightweight.
Port the operator's KDE/i3 keybinds expressed entirely in `hjkl` and letters with no arrow or navigation-cluster keys: numbered-workspace switch and move, focus and window movement, resize, terminal, floating, fullscreen, split, close, and force-kill, per the spec's keybind table.
Tune input: US-only layout with no switcher, Caps mapped to Escape with Shift+Caps still producing CapsLock, snappy key-repeat, touchpad tap-to-click plus natural scroll plus disable-while-typing, and flat mouse acceleration.
Set the feel: subtle animations, modest rounding, small gaps, and blur off (left as a knob a host such as zeus can enable).
Install Ghostty as the terminal on `Super+Return`.
Enable the desktop on neogaia.
## Acceptance criteria
- [ ] `modules/desktop/` exists with an aggregator exposing `modules.desktop.enable` that hand-lists and enables its pieces at default priority, each piece independently overridable.
- [ ] Desktop enable options are namespaced under a single desktop group; the Hyprland-native compositor lives in a subdirectory of the group.
- [ ] Hyprland is sourced from nixpkgs; the NixOS integration and the home-manager user config share one Hyprland package.
- [ ] The session launches through the universal Wayland session manager from a greetd/tuigreet text login.
- [ ] Keybinds match the spec's table, using only `hjkl`, letters, and number rows — no arrow or navigation-cluster keys.
- [ ] Input is tuned: US-only layout, Caps→Escape (Shift+Caps = CapsLock), snappy key-repeat, touchpad tap-to-click + natural scroll + disable-while-typing, flat mouse acceleration.
- [ ] Animations, rounding, and small gaps are on; blur is off and remains host-overridable.
- [ ] Ghostty opens on `Super+Return`.
- [ ] neogaia enables `modules.desktop` and builds green under `nix flake check`.

View File

@@ -0,0 +1,20 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
Theme the whole new graphical layer Nord from a single source, and set the wallpaper.
Add Stylix as a flake input and a desktop theming module that drives colors, system fonts, and cursor from one Nord base16 scheme across the graphical surface (GTK, Qt, and the compositor colors), plus a single static Nord wallpaper set by Stylix.
Scope Stylix to the graphical layer only: leave its targets for the existing terminal tools (nvim, tmux, fish) off so their established hand-themes stand unchanged.
The theming is reversible per target, so individual surfaces can migrate toward or away from manual theming later.
## Acceptance criteria
- [ ] Stylix is a flake input, wired into the host build.
- [ ] A desktop theming module resolves a single Nord base16 scheme and applies it to GTK, Qt, cursor, and system fonts.
- [ ] A single static Nord wallpaper is set by Stylix; no dynamic, animated, or cycling wallpaper.
- [ ] Stylix targets for nvim, tmux, and fish are off, leaving their existing themes untouched.
- [ ] neogaia builds green under `nix flake check`, and an eval probe confirms the resolved scheme is Nord.

View File

@@ -0,0 +1,19 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
A Waybar status bar that reads system state at a glance.
Add a Waybar module to the desktop group, enabled through the aggregator, showing workspaces with per-application icons plus a clock, battery, network, audio, MPRIS media controls, and a do-not-disturb toggle.
No overview/exposé plugin: the workspace indicators are sufficient.
The do-not-disturb toggle and media controls live in the bar rather than in a separate notification center.
## Acceptance criteria
- [ ] A Waybar module exists in the desktop group and is enabled by the aggregator.
- [ ] The bar shows workspaces with per-application icons, a clock, battery, network, audio, MPRIS media controls, and a do-not-disturb toggle.
- [ ] No overview/exposé plugin is used.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,20 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
A search-everything launcher, so one keybound tool handles launching and utility menus.
Add a rofi (Wayland fork) module to the desktop group, enabled through the aggregator, combining application-run, binary-run, and window-switch into one prompt, plus math-evaluation and emoji modes.
Bind it on `Super+R`.
Structure it so it is reusable as the dmenu-style frontend for later utility menus (clipboard history, power menu), and provide a power menu that uses it.
## Acceptance criteria
- [ ] A rofi module exists in the desktop group and is enabled by the aggregator.
- [ ] rofi combines application-run, binary-run, and window-switch modes, plus math evaluation and emoji.
- [ ] rofi opens on `Super+R`.
- [ ] rofi is usable as a dmenu-style frontend for utility menus, and a power menu is provided through it.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,18 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
Notification toasts with do-not-disturb and history recall, so missed notifications can be retrieved.
Add a mako module to the desktop group, enabled through the aggregator, rendering notification toasts with a do-not-disturb mode and history recall.
The do-not-disturb toggle and media controls live in the bar, not in a separate notification-center panel.
## Acceptance criteria
- [ ] A mako module exists in the desktop group and is enabled by the aggregator.
- [ ] Notification toasts appear, with do-not-disturb and history recall.
- [ ] No separate slide-out notification-center panel is added.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,21 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
A secure lock screen and idle management, so going idle, suspending, or closing the lid always lands at a locked screen.
Add hyprlock and hypridle modules in the Hyprland-native subdirectory of the desktop group, enabled through the aggregator.
hyprlock uses the compositor session-lock protocol so the lock surface is owned by the compositor and survives a locker crash.
hypridle is wired for lock-on-idle, screen-off, lock-before-suspend, and lid-close, with tunable timeouts.
Bind lock on `Super+X`.
## Acceptance criteria
- [ ] hyprlock and hypridle modules exist in the Hyprland-native subdirectory and are enabled by the aggregator.
- [ ] hyprlock uses the compositor session-lock protocol.
- [ ] hypridle triggers lock-on-idle, screen-off, lock-before-suspend, and lid-close, with tunable timeouts.
- [ ] Lock is bound on `Super+X`.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,18 @@
---
spec: hyprland-desktop
blocked-by: 0024-rofi-launcher
---
## What to build
Clipboard history picked entirely by keyboard.
Add a cliphist module (with wl-clipboard) to the desktop group, enabled through the aggregator, storing both text and image history and picked through rofi.
Bind the picker on `Super+Shift+V`.
## Acceptance criteria
- [ ] A cliphist module (with wl-clipboard) exists in the desktop group and is enabled by the aggregator.
- [ ] Text and image copies are recorded to history.
- [ ] The history is picked through rofi and bound on `Super+Shift+V`.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,19 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
Keyboard-driven screenshots that open in an annotation editor by default and land in both the clipboard and a file.
Add a screenshot module to the desktop group, enabled through the aggregator, using grim and slurp wrapped by grimblast and routed through the satty annotation editor so annotation is the default.
Cover region, active-window, and full-screen captures, each exporting to both the clipboard and a file.
Bind region on `Super+L`, active window on `Super+Shift+L`, and full screen on `Super+Ctrl+L`.
## Acceptance criteria
- [ ] A screenshot module exists in the desktop group and is enabled by the aggregator.
- [ ] Region, active-window, and full-screen captures work, each opening in satty and exporting to both clipboard and file.
- [ ] Captures are bound on `Super+L`, `Super+Shift+L`, and `Super+Ctrl+L`.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,20 @@
---
spec: hyprland-desktop
blocked-by: [0023-waybar-status-bar, 0025-mako-notifications]
---
## What to build
A keybound screen recorder that selects a region and then toggles recording.
Add a wf-recorder module to the desktop group, enabled through the aggregator, that selects a region first and then toggles video-only recording (no audio), bound on `Super+Shift+R`.
Surface a recording indicator in the Waybar bar and notification toasts on start and stop.
No audio capture and no full-screen recording variant.
## Acceptance criteria
- [ ] A wf-recorder module exists in the desktop group and is enabled by the aggregator.
- [ ] The recorder selects a region first, then toggles video-only recording on `Super+Shift+R`.
- [ ] A recording indicator appears in the bar, and notifications fire on start and stop.
- [ ] No audio is captured and no full-screen variant is provided.
- [ ] neogaia builds green under `nix flake check`.

View File

@@ -0,0 +1,18 @@
---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
Screen sharing that works inside applications, so video calls and browser screen-share function.
Add a portals module to the desktop group, enabled through the aggregator, wiring the Hyprland desktop portal (screencast, screenshot, global shortcuts) plus the GTK portal (file dialogs and appearance).
In-app screen sharing depends on these regardless of whether the recorder is present.
## Acceptance criteria
- [ ] A portals module exists in the desktop group and is enabled by the aggregator.
- [ ] The Hyprland desktop portal (screencast, screenshot, global shortcuts) and the GTK portal (file dialogs, appearance) are both configured.
- [ ] In-app screen sharing is available independent of the screen recorder.
- [ ] neogaia builds green under `nix flake check`.