Commit Graph
254 Commits
Author SHA1 Message Date
webadderall d3fab9d83e security: restrict read-local-file and open-external-url IPC handlers
- read-local-file: whitelist to RECORDINGS_DIR, USER_DATA_PATH, asset root, and temp only
- open-external-url: reject non-http/https protocols (blocks file://, javascript:, etc.)

Prevents malicious renderer code from reading arbitrary files (SSH keys,
credentials) or opening dangerous URLs via shell.openExternal.
2026-04-12 01:37:28 +10:00
webadderall 7073d7deb5 feat: extension system with marketplace, permissions, and security hardening
- Extension loader with manifest validation, ID sanitization, and path traversal protection
- Permission-gated runtime API (render, cursor, audio, timeline, ui, assets, export)
- Extension host with lifecycle management (activate/deactivate)
- Marketplace client for browsing, downloading, and installing extensions
- Extension Manager UI panel with enable/disable/uninstall
- IPC bridge for extension discovery, management, and marketplace operations
- Proxy guard on window.electronAPI to block extension access to privileged IPC
- Zip-slip protection via post-extraction directory traversal validation
- Safe PowerShell invocation for Windows zip extraction (no string interpolation)
- File URL resolution with path escape prevention
2026-04-12 01:37:28 +10:00
webadderall 3150ed41f2 chore(audio): clean up probeMediaDurationSeconds after #216
- Remove dead time= progress matching (no decode pass = no progress output)
- Remove stale comments about ffmpeg success/fallback behavior
- Lower timeout from 30s to 5s (header read is near-instant)
- Drop maxBuffer override (minimal stderr output now)
- Add -hide_banner to reduce stderr noise
2026-04-11 16:20:12 +10:00
Mohamed 0054bebef6 fix(audio): drop null muxer from probe to restore duration parsing
- Remove -f null - from probeMediaDurationSeconds() ffmpeg args
  so the command always exits non-zero (no output file specified)
- Without -f null -, ffmpeg exits code 1 and stderr lands in the
  catch block where Duration is parsed, fixing the bug where
  duration returned 0 on valid recordings
- probeMediaDurationSeconds returning 0 caused the
  videoDuration > 0 gate to skip all audio sync correction,
  leaving system audio misaligned in the final recording
2026-04-10 19:33:26 +02:00
webadderall 433173e0c5 Merge branch 'pr-207' 2026-04-09 23:31:08 +10:00
webadderall d8e57f7600 fix(whisper): reset download state on model deletion failure
When deleting the Whisper model failed, the frontend kept stale state
(whisperModelDownloadStatus stayed as 'downloaded'), which blocked
re-downloading because the download handler saw the model as already
present. On the backend, no progress event was sent on failure, leaving
the renderer out of sync.

Frontend: reset whisperModelDownloadStatus and progress to idle on
delete failure so re-download is unblocked.
Backend: verify whether the file was actually removed despite the error
and send appropriate progress events in either case.

Closes #152
2026-04-09 23:27:14 +10:00
Mohamed 0c5fa40c1f fix(hud): resolve overlay snap to primary on multi-monitor
- Add getHudOverlayDisplay() helper using getDisplayMatching()
  to detect which display the HUD is currently on
- Replace getPrimaryDisplay() in getHudOverlayBounds(),
  set-hud-overlay-compact-width, set-hud-overlay-measured-height
  handlers, and createHudOverlayWindow() maxHeight constraint
- Falls back to primary display when HUD window doesn't exist

Tested on Windows 11 with dual-monitor setup. HUD stays on
the external monitor through recording start/stop and
expand/collapse cycles.
2026-04-09 14:00:50 +02:00
webadderall 7d80678b38 fix(windows): use per-display scale factor for window cursor position
When recording a window on a secondary monitor with a different DPI,
getNormalizedCursorPoint() used the primary display's scale factor for
both cursor and window-bounds conversion. This produced incorrect
normalised coordinates. Now resolves the display that contains the
target window and uses that display's scale factor instead.

Fixes #204
2026-04-09 21:23:48 +10:00
webadderall fb54994685 fix(macos): lower deployment target to macOS 13.0 for native helpers
The Swift helper binaries were compiled with -target macos14.0, causing
dyld symbol-not-found crashes on macOS 13. The ScreenCaptureKit audio
APIs require macOS 13.0 minimum, so the deployment target is lowered to
13.0 and an #available guard is added for the macOS 14-only
ignoreShadowsSingleWindow API. README updated accordingly.

Fixes #199, fixes #200
2026-04-09 21:23:33 +10:00
webadderall ad426453c7 fix: harden cursor-monitor spawn against ENOENT on Windows
Use F_OK instead of X_OK for Windows fs.access check (X_OK is meaningless
on Windows). Wrap spawn() in try/catch to prevent uncaught exception if the
binary is missing or blocked by antivirus.
2026-04-09 16:07:57 +10:00
webadderall 646dcf92f0 fix: cursor DPI normalization for Windows/Linux scaled displays
On non-macOS platforms, platform APIs (iohook, GetWindowRect, xwininfo)
return physical pixel coordinates while Electron returns DIP coordinates.
Apply scaleFactor correction so cursor normalization uses a consistent
coordinate space. Fixes ~30-40px cursor offset on Windows 11 and Linux
Mint when display scaling is >100%.

Also fixes winget-releaser workflow (use v2 tag instead of invalid @latest).
2026-04-09 15:58:17 +10:00
Mohamed 20209cc02d fix(windows): use path.posix for URL path resolution
- replace path.normalize() with path.posix.normalize() in
  resolveRequestedFilePath to preserve forward slashes on Windows
- add empty-string guard for degenerate pathnames
- remove win32 bypass in loadPackagedEditorWindow

path.normalize() converts / to \ on Windows, causing path.resolve
to escape to the drive root and return 403 Forbidden.
2026-04-07 06:18:45 +02:00
webadderall 2692b28604 Hotfix 1.1.18 2026-04-06 22:39:31 +10:00
webadderall 2a155faaf6 Hotfix 1.1.17 2026-04-06 18:10:29 +10:00
webadderall 96d2ca9e5c Improve tray and packaged editor restore paths 2026-04-06 15:22:58 +10:00
webadderall 18812bda10 Fix Windows tray restore during recording 2026-04-05 23:23:16 +10:00
webadderall 498b5ef426 Load packaged renderer over localhost 2026-04-05 18:51:51 +10:00
webadderall 1e56c2d139 revert(recording): remove editor finalization phase 2026-04-04 22:26:25 +11:00
webadderall 5901dc7b90 revert(recording): drop linux editor visibility workaround 2026-04-04 22:15:32 +11:00
webadderall 22ec58e48a fix(recording): improve post-capture handoff 2026-04-04 22:14:15 +11:00
webadderall 5fd49fbf0f fix(audio): reduce recording and export drift 2026-04-04 21:53:25 +11:00
webadderall 965d4efac7 fix(windows): align Win10 HUD restore with interactive fallback 2026-04-04 17:22:37 +11:00
webadderall dbe1eb314c Merge pull request #167 from TARO-gh/fix/floating-toolbar-drag-drift
fix(windows): stabilize HUD drag by locking bounds size during move
2026-04-04 16:12:45 +11:00
TARO-gh 2cfed3d02f Merge branch 'webadderall:main' into fix/floating-toolbar-drag-drift 2026-04-04 12:39:20 +09:00
webadderall cab37792c3 update native capture helper binaries 2026-04-04 13:08:12 +11:00
webadderall 238281dcec configure smoke export window boot flow 2026-04-04 13:07:49 +11:00
webadderall 89bab3a923 bridge native export apis through preload 2026-04-04 13:07:49 +11:00
webadderall acf359d3cc add native export ipc handlers 2026-04-04 13:07:49 +11:00
webadderall ae2aefe4e2 add native export electron api typings 2026-04-04 13:07:42 +11:00
webadderall 75a90f5bed add native export ffmpeg helpers 2026-04-04 13:07:42 +11:00
TARO-gh 79c03f9039 fix(hud-overlay): keep drag bounds size fixed to prevent cursor drift on Windows 2026-04-03 16:45:31 +09:00
TARO-gh 302676bb77 fix(hud-overlay): ignore duplicate drag mousemove events to stop hold-drift 2026-04-03 15:35:29 +09:00
iRaziul 168d230c91 Fix Linux HUD input handling 2026-04-02 17:40:27 +06:00
webadderall c9f99ee498 fix(electron): Windows HUD visibility - moveTop after show, reassert mouse state on recording start 2026-04-02 21:09:32 +11:00
webadderall b08f4efb37 fix(electron): Win10 HUD click-through recovery 2026-04-02 16:29:51 +11:00
webadderall 13f99f07c8 fix(macos): use firstSampleTime as common time base in native recorder 2026-04-02 16:29:47 +11:00
webadderall 098abda72d fix(recording): improve webcam audio sync and delay compensation 2026-04-02 16:29:43 +11:00
webadderall db8718cf66 Add sidecar audio fallback for silent recordings 2026-04-01 15:40:40 +11:00
webadderall 1f1e445eb8 Fix macOS recording audio playback 2026-04-01 15:01:51 +11:00
webadderall 545019ff7d fix(recording): align auto-zoom cursor data for windows capture 2026-03-31 00:06:53 +11:00
webadderall 91a51951fa fix(recording): trim paused audio from native windows captures 2026-03-31 00:04:00 +11:00
webadderall f61a5982e3 fix(recording): persist microphone and system-audio preferences 2026-03-30 23:49:56 +11:00
webadderall dab9950a54 fix(recording): wrap recovery mux in try/catch to prevent video loss on audio failure 2026-03-30 22:55:53 +11:00
Azeem Tariq 3a0b3fca9e fix(recording): preserve mic audio when recovering mac capture 2026-03-30 15:47:13 +05:00
webadderall e8aa5ac5ad fix: add setDevicePermissionHandler for Windows 11 webcam access
Chromium (Electron 17+) requires setDevicePermissionHandler in addition
to setPermissionCheckHandler/setPermissionRequestHandler. Without it,
device-level access is silently denied on Windows 11 even though the
permission check passes, causing getUserMedia to throw NotAllowedError.
2026-03-30 15:41:01 +11:00
webadderall 9b5e612b96 fix: add Windows camera/microphone permission status logging
- Check systemPreferences.getMediaAccessStatus on Windows startup
- Log warnings when camera/mic access is denied so users know to check
  Windows Settings > Privacy > Camera/Microphone
2026-03-30 15:27:47 +11:00
webadderall ae392e573e fix: add COM init on WASAPI capture thread for Windows 11 compatibility
- Call CoInitializeEx(MTA) at start of captureThread() and CoUninitialize() on exit
- Windows 11 enforces per-thread COM initialization more strictly than Win10,
  causing GetBuffer/GetNextPacketSize to fail silently without this
- Add HRESULT error logging for WASAPI capture failures (GetNextPacketSize, GetBuffer)
2026-03-30 15:27:40 +11:00
webadderall 6f8891529a fix: use CGWindowID bounds for highlight animation instead of AppleScript
- Remove AppleScript 'front window' bounds query which returned wrong window
  for multi-window apps (e.g. Arc highlighting invisible auxiliary window)
- Use resolveMacWindowBounds() which queries by exact CGWindowID
- Keep AppleScript 'activate' call for bringing the app to front
2026-03-30 15:16:35 +11:00
webadderall 27a2be2d3b fix: filter auxiliary windows and remove thumbnail requirement from source list
- Swift helper: filter out untitled auxiliary windows from multi-window apps (e.g. Arc sidebar/tab-bar chrome)
- Swift helper: increase minimum window size from 1x1 to 50x50
- Remove .filter(source => Boolean(source.thumbnail)) that hid valid sources
- Remove hasUsableSourceThumbnail filter in fallback path
- Recompile prebundled openscreen-window-list binary
2026-03-30 15:16:28 +11:00
webadderall 0a30df9872 make dragger register 2026-03-30 14:21:00 +11:00