feat(desktop): add screenshot capture (task 0028) #20

Merged
alexion merged 3 commits from task-0028-screenshot-capture into main 2026-07-22 22:26:02 -04:00
Owner

Task: .claude/tasks/0028-screenshot-capture.md

Summary

Adds a modules.desktop.screenshot module, enabled by the desktop aggregator at mkDefault. grimblast (wrapping grim + slurp) captures a region, the active window, or the full screen to stdout and pipes into the satty annotation editor. satty's copy action is configured with --copy-command wl-copy --save-after-copy, so a single confirmation lands the shot in both the clipboard and a dated file under ~/Pictures/Screenshots. neogaia builds green under nix flake check.

Deviations

  • Binds are Print / Shift+Print / Ctrl+Print, not the spec's Super+L / Super+Shift+L / Super+Ctrl+L. Task 0021 already binds Super+L / Super+Shift+L / Super+Alt+L to the hjkl focus, window-move, and resize actions, so the literal spec binds are a direct collision with core navigation — and the spec's own keybind table lists both meanings for those keys, so it is internally contradictory. Two bind= lines for one combo don't coexist in Hyprland, so the collision had to be broken; the operator confirmed moving screenshots to the Print family, which preserves the plain/Shift/Ctrl → region/window/full pattern.
  • No waybar window-rewrite icon for satty, by the operator's direction (see Review below).

Review

Risk

Overall: Low

  • Blast radius: Low — new self-contained module, one mkDefault opt-in line and three keybinds; no existing behavior touched.
  • Reversibility: Low — pure addition, delete the file and the enable line to revert; no state or migration.
  • Test coverage: Low — no tests, but declarative Nix wiring where binding validity only surfaces at compositor load.
  • Sensitive domain: Low — screenshots to clipboard/disk, no auth, secrets, or permissions logic.
  • Size & complexity: Low — ~49 lines, one linear shell pipeline, no branching.
  • Runtime criticality: Low — desktop convenience tooling, not a hot or production-critical path.

Unaddressed findings

  • Standards / Spec — no waybar window-rewrite mapping for satty (project CLAUDE.md convention for graphical apps). Deliberately declined: satty is a transient floating annotation window rather than one that lives on a workspace, so at the operator's direction it gets no workspace glyph.

All other Standards and Spec findings (an inaccurate $mod comment, a run-on "what" comment, the enable-description phrasing, and under-documented deviation rationale) were fixed in the diff.

— Claude

Task: `.claude/tasks/0028-screenshot-capture.md` ## Summary Adds a `modules.desktop.screenshot` module, enabled by the desktop aggregator at `mkDefault`. `grimblast` (wrapping grim + slurp) captures a region, the active window, or the full screen to stdout and pipes into the satty annotation editor. satty's copy action is configured with `--copy-command wl-copy --save-after-copy`, so a single confirmation lands the shot in both the clipboard and a dated file under `~/Pictures/Screenshots`. neogaia builds green under `nix flake check`. ### Deviations - **Binds are `Print` / `Shift+Print` / `Ctrl+Print`, not the spec's `Super+L` / `Super+Shift+L` / `Super+Ctrl+L`.** Task 0021 already binds `Super+L` / `Super+Shift+L` / `Super+Alt+L` to the `hjkl` focus, window-move, and resize actions, so the literal spec binds are a direct collision with core navigation — and the spec's own keybind table lists both meanings for those keys, so it is internally contradictory. Two `bind=` lines for one combo don't coexist in Hyprland, so the collision had to be broken; the operator confirmed moving screenshots to the Print family, which preserves the plain/Shift/Ctrl → region/window/full pattern. - **No waybar `window-rewrite` icon for satty**, by the operator's direction (see Review below). ## Review ### Risk **Overall: Low** - Blast radius: Low — new self-contained module, one `mkDefault` opt-in line and three keybinds; no existing behavior touched. - Reversibility: Low — pure addition, delete the file and the enable line to revert; no state or migration. - Test coverage: Low — no tests, but declarative Nix wiring where binding validity only surfaces at compositor load. - Sensitive domain: Low — screenshots to clipboard/disk, no auth, secrets, or permissions logic. - Size & complexity: Low — ~49 lines, one linear shell pipeline, no branching. - Runtime criticality: Low — desktop convenience tooling, not a hot or production-critical path. ### Unaddressed findings - **Standards / Spec — no waybar `window-rewrite` mapping for satty** (project CLAUDE.md convention for graphical apps). Deliberately declined: satty is a transient floating annotation window rather than one that lives on a workspace, so at the operator's direction it gets no workspace glyph. All other Standards and Spec findings (an inaccurate `$mod` comment, a run-on "what" comment, the enable-description phrasing, and under-documented deviation rationale) were fixed in the diff. — Claude
alexion added 1 commit 2026-07-22 22:05:21 -04:00
Add a screenshot module wiring grimblast (grim + slurp) through the satty
annotation editor, enabled by the desktop aggregator. Region, active-window,
and full-screen captures each open in satty and, on confirm, land in both the
clipboard and a dated file under ~/Pictures/Screenshots.

Bound to Print / Shift+Print / Ctrl+Print rather than the spec's Super+L
family, whose keys task 0021 already holds for hjkl focus and window movement.
alexion added 1 commit 2026-07-22 22:09:58 -04:00
alexion added 1 commit 2026-07-22 22:22:22 -04:00
alexion merged commit 37ddf4342a into main 2026-07-22 22:26:02 -04:00
alexion deleted branch task-0028-screenshot-capture 2026-07-22 22:26:02 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alexion/dotfiles#20