with flex layout that reserves space above the bar for menu cards
- Increase HUD window size to 620x520 for menu card headroom
- Replace mic on/off toggle with mic selector card showing all available
microphones with live audio level meters per device
- Remove old separate mic controls panel
- Increase bar size with larger buttons, padding, and separators
- Fix TS null safety in stopRecording MediaRecorder accessfix
- Add pause, resume, and cancel recording controls with elapsed timer
- Move folder, language, and system audio into three-dots overflow menu with source highlight
wave
- Add countdownInProgress flag in IPC handler to reject concurrent starts
- Add countdownActive state in renderer to block re-entry
- Disable Record button while countdown is active
Keep the recording HUD visible on screen without burning it into captures, and make cursor sway match cursor motion while preserving the old 2x strength at the new 1x slider position.
- Add tray.on('click') to call focusOrCreateMainWindow() so left-click
on the systray icon opens/focuses the app on all platforms (was
previously only possible via right-click → Open).
- On Linux/Wayland, compositors often ignore focus() for security;
Electron's tray does not yet handle ProvideXdgActivationToken like
Qt apps (e.g. Telegram). Workaround: when the HUD exists but is
not focused, destroy and recreate it so the new window receives
focus (creation path works). Applied only for the HUD overlay, not
the editor.
- Reorder: show() before restore(), then moveTop(), focus() for
more reliable raise-on-restore.
Made-with: Cursor
Added `-target` flag to swiftc compilation to explicitly specify arm64-apple-macos14.0 or x86_64-apple-macos14.0 based on process architecture, ensuring proper binary compilation for darwin-arm64 native helpers.
When cursor-monitor.exe is missing, fails to spawn, or exits early,
keep cursorVisualType as 'arrow' instead of undefined. This prevents
the frontend from falling back to heuristic cursor type inference
which can produce incorrect results.
Build a standalone C++ helper (same pattern as wgc-capture) that polls
GetCursorInfo() every 50ms and emits STATE:<type> to stdout — identical
protocol to the macOS Swift helper. Windows recordings now capture
correct cursor types (text, pointer, resize, etc.) instead of always
falling back to arrow.
The HUD overlay window (500px) was narrower than the HUD bar's
max-width (560px), causing content to clip on both sides and a
horizontal scrollbar to appear.
- Widen HUD overlay window from 500px to 600px
- Add overflow-hidden to the root container
- Remove unnecessary max-w-[560px] from the HUD bar
- Use getRecordingsDir() instead of hardcoded RECORDINGS_DIR
- Fix stop order: video first, then audio save, then mux via new
mux-wgc-recording IPC
- Explicitly stop MediaStream tracks for audio resource cleanup
- Add native WASAPI audio capture (system loopback + mic) in C++ process
for sample-accurate sync; browser audio APIs crash with WGC
- Add window capture support (CreateForWindow) with window: source prefix
- Kill WGC capture process on app before-quit
- Add even-dimension guard in MFEncoder
- Fix ffmpeg asar path backslash handling on Windows
- Remove dead browser-side WGC audio code (storeWgcAudio IPC,
ScriptProcessorNode refs, stopWgcAudioCapture)
Uses Windows.Graphics.Capture to record the screen without the OS cursor
or the yellow capture border. Falls back to Electron capture on older Windows
or when the helper exe isn't available.
- Move recordings path control into HUD menu bar and refine separators/layout
- Show underlined Path: /folder/ label next to Record controls
- Add native folder picker to change recordings location
- Persist selected recordings directory and route recording/project defaults through it
uiohook-napi ships a native .node binary that cannot be loaded from
inside an .asar archive. Without asarUnpack, nodeRequire('uiohook-napi')
fails silently in packaged builds, the hook never starts, and cursor
telemetry stays empty on Windows.
Changes:
- Add node_modules/uiohook-napi/** to asarUnpack so the native binary
is extracted to app.asar.unpacked/ where require() can reach it
- Extend loadUiohookModule() fallback chain to handle variant export
shapes across platform builds (uIOhook / uiohook / Uiohook / default)
- Add normalizeHookMouseButton() and getHookMouseButton() helpers for
robust cross-platform button code handling (codes 38/39 variants)
- Add diagnostic log to startInteractionCapture() to surface hook load
state in future debug sessions
- Added electron IPC handler 'reveal-in-folder' to show exported file in finder
- Created toast notification with clickable action to reveal exported video
- Added Show in Folder button in export success dialog
- Implemented proper state management for exported file path
- Fixed timing issue where exportedFilePath was reset too early
Implements GIF export alongside MP4, including new export types, a GIF exporter module, UI components for format selection and GIF options, and integration into the export dialog and video editor. Adds property-based and unit tests for GIF export correctness, updates dependencies to include gif.js and related types, and refines Electron save dialog to support GIF files.