Skip to content

feat: add macOS native capture and cursor pipeline#1

Closed
EtienneLescot wants to merge 2 commits into
feat/cursor-pipelinefrom
feat/macos-native-capture-pipeline
Closed

feat: add macOS native capture and cursor pipeline#1
EtienneLescot wants to merge 2 commits into
feat/cursor-pipelinefrom
feat/macos-native-capture-pipeline

Conversation

@EtienneLescot
Copy link
Copy Markdown
Owner

Description

This draft PR starts the macOS-only port of the native capture and cursor pipeline introduced for Windows in PR siddharthvaddem#217.

The goal is to bring the same architectural separation to macOS: Electron owns recording/session orchestration, while a native ScreenCaptureKit helper owns screen/window capture, cursor exclusion, audio/webcam timing, encoding, and muxing.

This PR is currently stacked on feat/cursor-pipeline so the diff stays focused on macOS. It should be retargeted to main after the Windows-native PR lands.

What changed

  • Adds a macOS native recorder roadmap at docs/engineering/macos-native-recorder-roadmap.md.
  • Defines the first macOS helper contract in src/lib/nativeMacRecording.ts.
  • Adds source-id parsing helpers for ScreenCaptureKit display/window ids.
  • Adds focused tests for macOS source-id parsing.
  • Adds npm run build:native:mac as a placeholder build entrypoint.
  • Documents the expected macOS helper layout in electron/native/README.md.

macOS-only scope

This PR does not change Windows native capture behavior and does not add Linux native capture.

The macOS helper implementation is not shipped yet. This first step is the architecture/contract scaffold so the native helper can be added behind a clean boundary, matching the Windows WGC helper separation.

Architecture notes

The intended macOS backend follows the same separation used by the Windows helper and the same broad platform approach seen in Recordly:

  • macOS capture through ScreenCaptureKit-based native helpers.
  • Windows capture through a separate WGC helper.
  • Electron as the process/session coordinator.
  • Renderer code consuming stable contracts rather than helper-specific process details.

Validation run

Passed locally on Windows:

  • npm run build:native:mac (skips successfully on non-macOS hosts)
  • npm run build-vite
  • npx vitest run src\lib\nativeMacRecording.test.ts --pool=threads
  • npm test (137 tests passing)

Maintainer test checklist

Capture + Launch

  • pre commit check on macOS
  • Source selector opens and lists screens/windows with thumbnails
  • Selecting a source works for full screen and app window
  • Record start/stop works from launch window
  • Tray “Stop Recording” works while recording
  • Opening existing video file works from launch window
  • Opening existing project works from launch window

Audio

  • Mic toggle on/off works before recording
  • Mic device selection works
  • System audio toggle works across recordings
  • Mic-only recording works
  • System-audio-only recording works
  • Mic + system audio mix works and levels are balanced

Editor Load + Playback

  • Playback, pause, seek works.
  • Cursor telemetry overlays correctly

Timeline

  • Add/edit/remove different elements (zoom/ annotation/ trim/ speed), see how they are in playback and if they are 1:1 with exported video
  • Region drag/resize snaps and persists correctly
  • No overlap/ordering bugs on timeline items (apart from annotations)

Project Persistence

  • save/ load works

Other

  • Tweaking sliders/ wallpapers/ other effects.

@EtienneLescot EtienneLescot force-pushed the feat/macos-native-capture-pipeline branch from a4786a5 to 603e06c Compare May 11, 2026 08:33
@EtienneLescot
Copy link
Copy Markdown
Owner Author

Closing this duplicate PR because the macOS native capture branch is now opened against the upstream repository: siddharthvaddem#573

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.

2 participants