Skip to content

ci: bump actions/setup-node from 4 to 6#2

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/setup-node-6
Open

ci: bump actions/setup-node from 4 to 6#2
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/setup-node-6

Conversation

@dependabot
Copy link
Copy Markdown

@dependabot dependabot Bot commented on behalf of github May 9, 2026

Bumps actions/setup-node from 4 to 6.

Release notes

Sourced from actions/setup-node's releases.

v6.0.0

What's Changed

Breaking Changes

Dependency Upgrades

Full Changelog: actions/setup-node@v5...v6.0.0

v5.0.0

What's Changed

Breaking Changes

This update, introduces automatic caching when a valid packageManager field is present in your package.json. This aims to improve workflow performance and make dependency management more seamless. To disable this automatic caching, set package-manager-cache: false

steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
  with:
    package-manager-cache: false

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Dependency Upgrades

New Contributors

Full Changelog: actions/setup-node@v4...v5.0.0

v4.4.0

... (truncated)

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot @github
Copy link
Copy Markdown
Author

dependabot Bot commented on behalf of github May 9, 2026

Labels

The following labels could not be found: ci, dependencies. Please create them before Dependabot can add them to a pull request.

Please fix the above issues or remove invalid values from dependabot.yml.

aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aryasadeghy added a commit that referenced this pull request May 10, 2026
…click + key overlays

Substantial v0.4 milestone. CleanShot X-equivalent recorder built end to
end on one branch — region / display / window modes, microphone capture,
floating webcam preview, click highlight + keystroke pill overlays, full
Settings panel, HUD recording cards with REC badge, history rows. Single
PR per the new "one feature, one branch" rule (CLAUDE.md).

Foundation
- Bundled `ffmpeg` (evermeet.cx static build) at `resources/bin/ffmpeg-{arch}`,
  fetched + sha256-locked by `scripts/prepare-resources.mjs`. Re-enabled
  `extraResources` in `electron-builder.yml`. Postinstall pulls the host arch.
- New `uiohook-napi` dep for global mouse/key events (prebuilt N-API
  addon, same model as `better-sqlite3`).
- DB migration `0002` adds `kind` ('screenshot' | 'recording') and
  `duration_ms` columns to the `captures` table.

Architecture
- `src/main/recording/session.ts` — module-level singleton, state machine
  (idle → countdown → recording → stopping → finalizing → idle | failed).
  Spawns ffmpeg with `h264_videotoolbox`, optional avfoundation mic input,
  crop filter for region mode. Graceful stop via `q` to stdin, SIGINT/KILL
  fallback. Pure helpers extracted to `cropArgs.ts`, `recordingArgs.ts`,
  `ffmpegDevicesParse.ts` for unit testing.
- `controlsWindow.ts` — frameless `floating`-level timer + Stop bar
  (sits below the avfoundation `screen-saver` capture so it doesn't
  appear in the recording).
- `webcamWindow.ts` — floating BrowserWindow with `getUserMedia`. Position,
  size, shape (rectangle/rounded/circle), mirror, and fullscreen mode.
- `effectsWindow.ts` — fullscreen click-through transparent overlay that
  paints click ripples + keystroke pills. Lazy-loads `uiohook-napi`;
  Accessibility permission missing → graceful no-overlay fallback.
- `system/doNotDisturb.ts` — toggles macOS DnD via the Shortcuts CLI.

UI
- New "Recording" Settings tab (was a stub) with every CleanShot knob:
  Quality (mode/framerate/bitrate), Audio (mic device picker, system audio
  flagged as follow-up), Webcam (device/position/size/shape/mirror/
  fullscreen), Capture clicks (color/size/style/animation), Capture
  keystrokes (position/size/style/all-vs-modifier-only), Behavior
  (countdown, hide notifications).
- Tray "Record Screen" item is live, flips to "Stop Recording" while a
  session is active, and the tray title shows `● REC`.
- HUD card shows a red REC badge + duration for recording cards. Thumbnail
  is a still frame extracted via `ffmpeg -ss 1 -frames:v 1`.
- Three new renderer entries (`recording-controls`, `recording-effects`,
  `webcam`) wired into `electron.vite.config.ts`.

ADRs
- 0004 — bundling ffmpeg (provenance, signing plan, Rosetta caveat)
- 0005 — recording state singleton (matches hud.ts/overlay.ts conventions)
- 0006 — uiohook-napi vs the no-native-code rule

Tests (41 total, +20 new)
- `recording-cropArgs.test.ts` — DIP→pixel crop math + Retina handling
- `recording-args.test.ts` — ffmpeg argv builder
- `recording-ffmpegDevices.test.ts` — avfoundation list_devices stderr parser

Workflow rule (also new)
- CLAUDE.md "Working with Claude" gains rule #2: features ship on one
  branch, not pre-split into PR-1 / PR-2. Memory entry saved.

Out of scope (deferred to future PRs, documented in the saved plan):
- System audio via BlackHole
- GIF export from HUD card / editor
- Trim editor (HTML5 video + ffmpeg -ss -t)
- Window-mode bounds picker (currently records the display the window is on)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

0 participants