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:
34
.claude/tasks/0021-desktop-group-and-hyprland-session.md
Normal file
34
.claude/tasks/0021-desktop-group-and-hyprland-session.md
Normal 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`.
|
||||
20
.claude/tasks/0022-stylix-nord-theming.md
Normal file
20
.claude/tasks/0022-stylix-nord-theming.md
Normal 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.
|
||||
19
.claude/tasks/0023-waybar-status-bar.md
Normal file
19
.claude/tasks/0023-waybar-status-bar.md
Normal 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`.
|
||||
20
.claude/tasks/0024-rofi-launcher.md
Normal file
20
.claude/tasks/0024-rofi-launcher.md
Normal 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`.
|
||||
18
.claude/tasks/0025-mako-notifications.md
Normal file
18
.claude/tasks/0025-mako-notifications.md
Normal 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`.
|
||||
21
.claude/tasks/0026-hyprlock-and-hypridle.md
Normal file
21
.claude/tasks/0026-hyprlock-and-hypridle.md
Normal 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`.
|
||||
18
.claude/tasks/0027-cliphist-clipboard-history.md
Normal file
18
.claude/tasks/0027-cliphist-clipboard-history.md
Normal 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`.
|
||||
19
.claude/tasks/0028-screenshot-capture.md
Normal file
19
.claude/tasks/0028-screenshot-capture.md
Normal 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`.
|
||||
20
.claude/tasks/0029-screen-recording.md
Normal file
20
.claude/tasks/0029-screen-recording.md
Normal 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`.
|
||||
18
.claude/tasks/0030-desktop-portals.md
Normal file
18
.claude/tasks/0030-desktop-portals.md
Normal 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`.
|
||||
Reference in New Issue
Block a user