Skip to content

feat(capture): add screenshots, annotations and desktop pins - #2

Draft
avabbbb wants to merge 5 commits into
fix/global-recording-shortcutsfrom
feat/screenshot-and-pin
Draft

avabbbb wants to merge 5 commits into
fix/global-recording-shortcutsfrom
feat/screenshot-and-pin

Conversation

@avabbbb

@avabbbb avabbbb commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Adds a screenshot → annotation → desktop pin workflow to the fork. Start with the HUD's Screenshot button or Ctrl+Alt+S (Cmd+Option+S on macOS). This reuses the existing capture-picker geometry/UI, freezing the display before the overlay appears; it does not change the selected video recording source.

Includes rectangles, arrows, editable placed text, mosaic, numbered markers, HEX/RGB colors, undo/redo, and identical flattened PNG output for copy/save/pin. Pins have independent lifetimes, native always-on-top, wheel resizing, opacity, copy/save, and close controls. Images stay in memory until saved. Existing shortcut overrides are preserved when the screenshot action is introduced. Screenshot/global handlers register after the shared preload IPC dependencies are ready. Screenshot and recording selection reserve the same picker before asynchronous source enumeration or frame capture, preventing startup races from replacing each other's overlays.

Stacked PR: base is fix/global-recording-shortcuts, the fork branch behind upstream PR #1137. This keeps the screenshot feature review separate from that recording/remote-HUD fix. No merge is performed.

Usage, boundaries, and acceptance

Annotations on synthetic content

Verification

  • Typecheck, checks on 19 changed/new TypeScript files, and diff whitespace checks pass; renderer/Electron main/preload builds pass.
  • 47 focused unit tests pass, including native IPC ownership/lifetime, crop coordinates and recording/source-picker regressions. The shortcut and screenshot IPC suites were rerun after their final follow-ups.
  • 28 capture-picker/remote-control/screenshot browser scenarios pass together using installed Chrome. The additional HUD suite passed 6/7 initially; its remaining case passed with a temporary 15-second expectation after timing out while the Home skeleton loaded under the default 5 seconds. No repository timeout config is changed. All 35 distinct scenarios passed across runs.
  • Real Windows native run: Electron desktop capture and the actual picker UI cropped a synthetic window into a 300×150 PNG at scale factor 1. The center BGRA pixel was [71,71,211,255], matching the source. PNG writing/decoding and clipboard image dimensions were verified; the save-dialog destination was automated and the prior supported clipboard formats were restored.
  • The native run also verified a real pin's always-on-top property, opacity, wheel-driven window size change, and destruction through its close button. Native test data/profile were isolated from installed Recordly and user recordings/settings.
  • Full suite: 1587 passed, 9 failed, 7 skipped. All 9 failure names exactly match the unchanged upstream baseline collected in this session (captions, project trash, library, and share-thumbnail/environment failures). The final full-suite failure names were compared programmatically against that baseline. This is not an all-green full suite.

Remaining scope

Draft until real macOS permission/capture and mixed-DPI native multi-monitor behavior are checked. Native drag movement and UU delivery remain manual acceptance items. Linux screenshots are explicitly unsupported; existing Linux recording selection is retained. This does not add scrolling screenshots, clipboard-to-pin import, a color eyedropper, arbitrary editing of every annotation, or the unified screenshot/GIF/MP4 action toolbar. See the linked guide and design PR #1.

…FFmpeg

existsSync alone accepted an unrunnable ffmpeg-static binary (EFTYPE), breaking every FFmpeg feature. Probe once with -version and cache the result.
…apture

- Lightweight mode (default on, settings toggle, restart to apply) skips aggressive global GPU switches and starts tray-only without the HUD renderer; idle Private memory ~145 MB vs ~1220 MB.

- HUD is created on demand and destroyed after editor/GIF flows in lightweight mode.

- Tray menu: Screenshot / Record GIF / Record Video / Open Recorder / Quit.

- Region GIF capture converts the recording in the main process via FFmpeg (palettegen/paletteuse, 15 fps, max width 960) without opening the editor.
- Main process owns captureOutputMode (editor | gif); get/set-capture-output-mode IPC, set accepted only from the HUD, changes broadcast to the HUD.

- HUD idle bar: Screenshot action plus GIF / Video radio group; tray Record GIF / Record Video update the same state.

- Mode is sticky instead of resetting after one GIF or on Open Recorder; finalizing copy says the GIF is being saved.
@avabbbb
avabbbb force-pushed the fix/global-recording-shortcuts branch from 76b26b4 to e018e5c Compare October 18, 2026 14:11
@avabbbb
avabbbb force-pushed the feat/screenshot-and-pin branch from db751e2 to 8989e18 Compare October 18, 2026 14:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant