Move model load and transcription off the renderer main thread into a
dedicated worker (transcribe.worker.ts + transcribeCore.ts) so the editor
UI no longer freezes during captioning. Relocate the auto-captions action
from the editor header into the timeline toolbar, and add the missing
it/pt-BR/ru/vi autoCaptions translations.
- Unify sidecar key name to camelCase cursorRecordingData (was mixing
cursor-recording-data and cursorRecordingData in the same checklist)
- Graceful-degradation test now removes both binary copies so the
missing-helper fallback is actually exercised (build/ and bin/darwin-*)
- Healthy recording section points to <videoPath>.cursor.json sidecar
instead of the .openscreen project file, which does not embed cursor data
Documents the cursor helper binary, permissions, manual test checklist,
expected sidecar shape, and known limitations for the darwin native
cursor path.
SourceSelector.test.tsx uses toBeInTheDocument but never imported
@testing-library/jest-dom, and vitest.config.ts has no setupFiles to
register the matchers globally. It only passed when test ordering
happened to leak the matcher from another file, making CI intermittently
red on main (e.g. the #652 merge). Importing jest-dom directly makes the
test self-sufficient and deterministic.
- EditorEmptyState shown when no video is loaded: Import Video, Load
Project, and drag-drop of .openscreen files.
- "Open Studio" button in the recording HUD (replaces the two separate
open-video / open-project buttons).
- New Project flow that clears back to the dashboard, prompting to save
on unsaved changes; Load Project now prompts too (variant-aware dialog).
- Rebuilt on current main, preserving main's export refactor, cursor-clip
/ zoom-preview / trim-waveform work and the vertical/horizontal HUD tray.
- Replace lastEmittedAssetId with a process-wide Set<String> so each unique
cursor shape is serialised at most once even across non-adjacent repeats
(e.g. arrow → text → arrow no longer resends the arrow bitmap)
- Wrap the sampling loop body in autoreleasepool{} to prevent Cocoa objects
(NSBitmapImageRep, PNG Data, base64 String) from accumulating for the
lifetime of the helper during long recordings
- Update stale Accessibility comments: missing Accessibility only disables
text/pointer affordance detection; native bitmap capture is unaffected
Capture the real system cursor image during macOS recording so custom and
default cursors render natively instead of being mapped to bundled SVGs,
bringing macOS in line with the Windows WGC capture path.
- macOS cursor helper grabs NSCursor.currentSystem as a PNG asset (SHA256 id,
intrinsic scale factor, pixel hotspot); the bitmap payload is emitted once per
shape and referenced by assetId thereafter
- helper returns nil cursorType instead of an arrow fallback so default/custom
cursors fall through to the captured bitmap while text/pointer stay beautified
- MacNativeCursorRecordingSession collects deduped assets, tags samples with
assetId, and reports provider "native" when bitmaps are captured
Maps KeyboardEvent.key values (e.g., "ArrowDown", " ") to their
Electron accelerator equivalents (e.g., "Down", "Space") to prevent
global shortcut registration failures.
The per-column fillRect skipped columns with amplitude < 0.5 px, causing
the waveform to disappear entirely at certain zoom levels. Revert to the
closed polygon + top-edge stroke which always renders something.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two fixes:
1. topInset/bottomInset both set to 3 — items are center-aligned in the
36 px row (3 px gap top and bottom), so the drawing zone must match.
topInset=0 was drawing 3 px above the trim box top.
2. Replace closed polygon with per-column fillRect so silent sections
(barH < 0.5 px) produce no pixels instead of a flat green baseline.
The top-edge stroke lifts the pen across silent gaps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>