feat: add macOS native capture and cursor pipeline#1
Closed
EtienneLescot wants to merge 2 commits into
Closed
Conversation
…-pipeline feat: add Windows native capture and cursor pipeline
EtienneLescot
force-pushed
the
feat/macos-native-capture-pipeline
branch
from
May 11, 2026 08:33
a4786a5 to
603e06c
Compare
Collaborator
Author
|
Closing this duplicate PR because the macOS native capture branch is now opened against the upstream repository: siddharthvaddem#573 |
This was referenced Jun 22, 2026
EtienneLescot
added a commit
that referenced
this pull request
Jun 25, 2026
PR #1 of the docs site effort tracked in ROADMAP.md (Stability & quality tier). - website/: minimal Docusaurus 3 site (TS config, Infima-tweaked theme, hero landing with WIP badge, intro doc only). - .github/workflows/docs.yml: build on PR, deploy to GitHub Pages on push to main. Concurrency group, minimal permissions. - Local postcss.config.cjs to override monorepo Tailwind config so Docusaurus CSS pipeline doesn't try to load Tailwind. PR #2 will polish the landing (full bento, demo, footer polish). PR #3 will migrate docs/ -> website/docs/.
EtienneLescot
added a commit
that referenced
this pull request
Jul 1, 2026
Three follow-up bugs from the last test pass: #1 — Navigator strip not visible. After moving it into TimelinePane (commit 0d3600e) the section's flex layout shrunk it to 0 because the wrapper has overflow: hidden and the section is height: 100% with a flex: 1 viewport sibling. Fix: .timelineNavigator gets flex-shrink: 0 + 4px margin (visual separation from the viewport above). The strip now has a stable ~20px row of its own below the header. #2 — Place-skip button is redundant. Per user feedback the correct button is the Scissors (Trim) one in the top toolbar — the header 'Place skip' button I added in C3 is removed. The Scissors now toggles pendingCutPlacement (was: called tl.addSkip() to drop a skip at currentTimeSec). The 'T' keyboard shortcut in NewEditorShell also toggles via a ref (togglePlaceSkipRef) that Bottombar registers through a setTogglePlaceSkip prop drilling. #3 — Place-skip didn't accept clicks on clip blocks. The handler excluded any target inside [data-clip-idx], so clicking the visible clip track area did nothing. Fix: only buttons (skip chevrons / edit / delete) are excluded. Clicks on clip blocks, lanes, ruler, and empty space all dispatch addCut. Stops propagation on the click so the clip's onClick (select) doesn't also fire. State ownership: pendingCutPlacement + pendingCutPreviewSec + Esc handler + body class live in Bottombar. TimelinePane reads them as props. NewEditorShell's 'T' shortcut reads them via ref. Verified: tsc clean, biome clean, 412 tests pass.
EtienneLescot
added a commit
that referenced
this pull request
Jul 1, 2026
#1 — Navigator strip was missing visually despite flex-shrink: 0 (commit fb2bfe2). Root cause: the .timelineNavigator CSS lived in NewEditorShell.module.css, but TimelinePane applies the className via its own styles import (TimelinePane.module.css). CSS modules generate per-file class hashes — .timelineNavigator in NewEditorShell becomes NewEditorShell_timelineNavigator__xxx, while styles.timelineNavigator in TimelinePane resolves to TimelinePane_timelineNavigator__yyy. The two never match, so the element had no styles at all → 0 height → invisible. Fix: move the entire .timelineNavigator + child class block from NewEditorShell.module.css into TimelinePane.module.css so the CSS hashes line up with the JSX className application. #2 — Tightened the place-skip crosshair override to also cover .timelineHeader, every button inside it, and the VtBtn toolbar buttons. Some of these have their own cursor values that were overriding the body-level crosshair rule. Verified: tsc clean, biome clean, 412 tests pass.
EtienneLescot
added a commit
that referenced
this pull request
Jul 2, 2026
Three follow-up bugs from the last test pass: #1 — Navigator strip not visible. After moving it into TimelinePane (commit 0d3600e) the section's flex layout shrunk it to 0 because the wrapper has overflow: hidden and the section is height: 100% with a flex: 1 viewport sibling. Fix: .timelineNavigator gets flex-shrink: 0 + 4px margin (visual separation from the viewport above). The strip now has a stable ~20px row of its own below the header. #2 — Place-skip button is redundant. Per user feedback the correct button is the Scissors (Trim) one in the top toolbar — the header 'Place skip' button I added in C3 is removed. The Scissors now toggles pendingCutPlacement (was: called tl.addSkip() to drop a skip at currentTimeSec). The 'T' keyboard shortcut in NewEditorShell also toggles via a ref (togglePlaceSkipRef) that Bottombar registers through a setTogglePlaceSkip prop drilling. #3 — Place-skip didn't accept clicks on clip blocks. The handler excluded any target inside [data-clip-idx], so clicking the visible clip track area did nothing. Fix: only buttons (skip chevrons / edit / delete) are excluded. Clicks on clip blocks, lanes, ruler, and empty space all dispatch addCut. Stops propagation on the click so the clip's onClick (select) doesn't also fire. State ownership: pendingCutPlacement + pendingCutPreviewSec + Esc handler + body class live in Bottombar. TimelinePane reads them as props. NewEditorShell's 'T' shortcut reads them via ref. Verified: tsc clean, biome clean, 412 tests pass.
EtienneLescot
added a commit
that referenced
this pull request
Jul 2, 2026
#1 — Navigator strip was missing visually despite flex-shrink: 0 (commit fb2bfe2). Root cause: the .timelineNavigator CSS lived in NewEditorShell.module.css, but TimelinePane applies the className via its own styles import (TimelinePane.module.css). CSS modules generate per-file class hashes — .timelineNavigator in NewEditorShell becomes NewEditorShell_timelineNavigator__xxx, while styles.timelineNavigator in TimelinePane resolves to TimelinePane_timelineNavigator__yyy. The two never match, so the element had no styles at all → 0 height → invisible. Fix: move the entire .timelineNavigator + child class block from NewEditorShell.module.css into TimelinePane.module.css so the CSS hashes line up with the JSX className application. #2 — Tightened the place-skip crosshair override to also cover .timelineHeader, every button inside it, and the VtBtn toolbar buttons. Some of these have their own cursor values that were overriding the body-level crosshair rule. Verified: tsc clean, biome clean, 412 tests pass.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-pipelineso the diff stays focused on macOS. It should be retargeted tomainafter the Windows-native PR lands.What changed
docs/engineering/macos-native-recorder-roadmap.md.src/lib/nativeMacRecording.ts.npm run build:native:macas a placeholder build entrypoint.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:
Validation run
Passed locally on Windows:
npm run build:native:mac(skips successfully on non-macOS hosts)npm run build-vitenpx vitest run src\lib\nativeMacRecording.test.ts --pool=threadsnpm test(137 tests passing)Maintainer test checklist
Capture + Launch
Audio
Editor Load + Playback
Timeline
Project Persistence
Other