Commit Graph
80 Commits
Author SHA1 Message Date
webadderall 9df44c7bbf Align recorder and cursor pause boundaries 2026-05-01 17:18:12 +10:00
webadderall 667efdc02e Fix cursor sync after recording pause 2026-05-01 16:47:42 +10:00
webadderall 98e4c7cade Improve project autosave and media path handling 2026-04-27 20:07:32 +10:00
webadderall 624c3047be Improve HUD and update prompt UI 2026-04-25 21:34:55 +10:00
webadderall aab14e822a Merge pull request #295 from BillLucky/fix/export-large-files-upstream
fix(export): stream MP4 output to disk to unblock >2 GiB exports
2026-04-25 00:45:44 +10:00
webadderall 66bd91e6a5 Merge pull request #321 from meiiie/fix/win10-floating-webcam-preview
fix(launch): disable floating webcam preview without passthrough
2026-04-25 00:44:41 +10:00
大彪 9ac4dbd2e8 fix(export): stream MP4 output to disk to unblock >2 GiB exports
Long recordings (35-minute screencaps were the motivating case) fail at
the 99% "Finalizing" step with a RangeError once the muxed MP4 would
exceed V8's ~2 GiB per-ArrayBuffer limit. Both export paths accumulate
the whole file in renderer memory and round-trip it through IPC, so no
output size past that point can complete:

- Legacy: src/lib/exporter/muxer.ts uses mediabunny's BufferTarget,
  which holds the entire MP4 in a single ArrayBuffer. finalize() → Blob
  → blob.arrayBuffer() → ipcRenderer.invoke('write-exported-video-to-
  path', arrayBuffer, path) — every step wants a ≥2 GiB contiguous
  allocation.
- Lightning: native-video-export-finish did fs.readFile(finalizedPath)
  and shipped the bytes back to the renderer, which re-serialized them
  again. Same ceiling.

This change moves the finished MP4 across the renderer↔main boundary
via a temp file instead of an ArrayBuffer:

- New electron/ipc/export/exportStream.ts manages streaming temp files
  via fh.write(buf, 0, len, position) so out-of-order writes (moov box
  rewrites, etc.) stay safe. Each session lives in a 0700 mkdtemp()
  directory opened with O_CREAT | O_EXCL so a hostile local user on a
  shared tempdir cannot pre-plant a symlink at the predicted path.
- New renderer-facing IPCs: export-stream-open/write/close,
  finalize-exported-video (renames temp to final path, copy+unlink
  fallback on EXDEV/EPERM/ENOTEMPTY with console.warn on leaked bytes),
  mux-exported-video-audio-from-path (FFmpeg audio fallback that takes
  a path instead of an ArrayBuffer), and discard-exported-temp. Every
  handler validates the caller-supplied path against an owned-export-
  paths registry before touching disk, so a compromised renderer cannot
  route arbitrary filesystem paths into main-process deletes/moves.
- The muxer now picks mediabunny's StreamTarget automatically when the
  Electron bridge is available (BufferTarget stays for tests and any
  non-Electron callers). finalize() returns { mode, tempFilePath,
  bytesWritten } or { mode, blob } so the exporter can branch.
- Exporters forward tempFilePath through ExportResult. Lightning's
  finish returns the ffmpeg temp path directly; the FFmpeg audio
  fallback forks on the muxer result type. modernVideoExporter's
  Lightning success branch now accepts tempFilePath (previously it
  checked blob only, which regressed every native export).
- VideoEditor.tsx dispatches on tempFilePath: finalize via the new IPC,
  keep the temp in place when the save dialog is canceled so "Save
  Again" still works without re-rendering, keep the pending-save entry
  alive on non-canceled save failures, and discard the temp on unmount
  or explicit clear. GIF and smoke-test code paths still use the
  legacy Blob path unchanged.
- app.on('before-quit') also reaps any open streaming sessions via
  cleanupAllExportStreams().

Chunk size is 16 MiB — well under Electron/Mojo IPC message limits
while keeping total writes low (~160 for a 2.5 GB export).

Tested locally: exported a 35:13 source (~2.7 GiB H.264 input) at
Original 1920×1080 + Balanced. Previously failed on finalize with a
RangeError; with this patch the Legacy pipeline produced a valid 3.7
GiB MP4 whose ffmpeg -i duration/streams match the source.

Addresses #194.
2026-04-24 16:02:37 +08:00
webadderall 62f2a52860 Fix companion audio sync for trimmed and long exports 2026-04-24 12:04:21 +10:00
wiiiii123 bac0a0282f fix(launch): disable floating webcam preview without passthrough 2026-04-23 10:52:41 +07:00
wiiiii123 fcdc842371 fix(export): fast-path simple edited audio tracks 2026-04-21 18:09:23 +07:00
webadderall d09f88abdb Merge pull request #284 from meiiie/research/export-pipeline-profiling
chore(export): expand finalization profiling
2026-04-21 18:26:03 +10:00
webadderall 337569739c fix(editor): port project save UX and clip cleanup to main 2026-04-21 11:46:07 +10:00
wiiiii123 b7e5a4ab79 chore(export): add ffmpeg mux timing breakdown 2026-04-20 20:09:54 +07:00
webadderall 45b6879d86 fix: serve video files via local HTTP server to fix loading on Windows
On Windows, the packaged app serves the renderer from http://127.0.0.1:PORT,
which causes Chromium to block file:// URLs in <video> elements — even with
webSecurity disabled. This affects all users running the packaged build.

Add a local media HTTP server (random port) that streams approved video files
with range request support for seeking. The renderer now resolves video paths
through this server instead of using file:// URLs directly.

- electron/mediaServer.ts: HTTP server with path validation against
  approvedLocalReadPaths and Content-Range support
- IPC handler 'get-local-media-url' converts file paths to HTTP URLs
- resolveVideoUrl() in renderer falls back to file:// if server unavailable
- Improved <video> onError to log actual MediaError details

Fixes #244
2026-04-18 15:55:43 +10:00
webadderall 8abceaa914 feat: add H.264 stream-copy export, overhaul exporter pipeline, rename native binaries
- IPC: new inputMode 'h264-stream' — browser VideoEncoder output stream-copied
  into MP4 via ffmpeg rather than piping raw RGBA frames, cuts memory usage
- Security: replace flat approvedLocalReadPaths with userApprovedPaths fed from
  dialog pickers and project load; isAllowedLocalReadPath uses it alongside
  dir prefix / existsSync checks
- nativeVideoExport: add buildNativeH264StreamExportArgs for stream-copy path
- frameRenderer / modernFrameRenderer: cursor-follow camera integration,
  annotation blur post-processing, shadow profile, squircle geometry
- audioEncoder / streamingDecoder / gifExporter / muxer: full pipeline
  hardening — drift correction, backpressure, proper teardown
- Rename native helpers openscreen-* → recordly-* on darwin-arm64 and
  darwin-x64; update helpers-manifest.json for win32-x64
- electron/main, windows, updater, rendererServer: startup and window
  lifecycle improvements
- preload: expose inputMode and new IPC surface to renderer
2026-04-16 17:51:41 +10:00
Wing900 654ed79ba8 Fix silent MP4 exports with FFmpeg audio fallback 2026-04-12 20:55:34 +08:00
webadderall 6296a05115 fix(audio): add browser microphone fallback for macOS < 14
On macOS versions before Sonoma (14.0), SCStreamConfiguration does not
support the captureMicrophone/microphoneCaptureDeviceID selectors. The
native helper was throwing a fatal error, blocking recording entirely
when microphone was enabled.

Now the Swift helper logs MICROPHONE_CAPTURE_UNAVAILABLE and continues
capture without microphone. The Node handler detects this signal and
returns microphoneFallbackRequired to the renderer, which starts a
browser-side MediaRecorder capturing the mic via getUserMedia. On stop,
the audio blob is saved as a .mic.webm sidecar alongside the native
recording, where the existing companion audio detection picks it up.

Fixes: 'Native microphone capture is unavailable on this macOS/Xcode
runtime' error on older macOS versions.
2026-04-12 16:59:06 +10:00
webadderall d6f1225e45 feat(extensions): marketplace integration, wallpaper thumbnails, cursor packs, and bug fixes
- Extension marketplace UI with browsing, installing, screenshot gallery
- Wallpaper & cursor style registration API for extensions
- Wallpaper thumbnail system (nativeImage resize + disk cache, OOM-safe)
- Fix HUD crash: check configurable before redefining electronAPI
- Fix zip-slip false positive on macOS (fs.realpath for symlinks)
- Extension icon sizing and description truncation improvements
- Eager extension activation in SettingsPanel
2026-04-12 01:38:36 +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 1e56c2d139 revert(recording): remove editor finalization phase 2026-04-04 22:26:25 +11:00
webadderall 89bab3a923 bridge native export apis through preload 2026-04-04 13:07:49 +11:00
webadderall db8718cf66 Add sidecar audio fallback for silent recordings 2026-04-01 15:40:40 +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 0a30df9872 make dragger register 2026-03-30 14:21:00 +11:00
webadderall 9aac961c1d fix(hud): make transparent areas click-through
- Set setIgnoreMouseEvents(true, {forward: true}) on HUD overlay window
  so transparent areas pass clicks to apps behind
- Add hud-overlay-set-ignore-mouse IPC to toggle mouse events
- Re-enable mouse events on mouseenter over visible HUD content,
  disable again on mouseleave
2026-03-30 13:32:24 +11:00
webadderall f5c92964a4 feat(updater): add update status summary, logging, and new IPC channels
- Add UpdateStatusSummary type and getUpdateStatusSummary() for exposing
  updater state to renderer processes
- Add writeUpdaterLog() for persistent updater diagnostics
- Add configureUpdateFeed() for feed URL configuration
- Wire up get-update-status-summary and check-for-app-updates IPC handlers
- Add primaryAction field to UpdateToastState for actionable toast buttons
- Add checking-for-update event handler with status tracking
- Surface automatic check errors via toast when appropriate
2026-03-29 19:30:01 +11:00
webadderall ba5fac0f06 fixed webcam disappearing 2026-03-29 10:31:50 +11:00
webadderall 641d3d271f feat(updater): add explicit download toast flow 2026-03-28 21:06:41 +11:00
webadderall 6463cdff58 feat: add updater release infrastructure 2026-03-28 20:42:38 +11:00
webadderall 045850417f feat(debug): add native capture diagnostics 2026-03-28 16:08:43 +11:00
webadderall 719fa78e9f Revert "feat: Advanced Video Editor Implementation, Native WGC Integration, and AI Auto-Captions" 2026-03-28 14:12:25 +11:00
Mahdy Arief 01350ad8df feat: improve timeline selection interaction with Shift+drag and closure fixes 2026-03-27 21:59:03 +07:00
Mahdy Arief ced02c9a8f feat: Implement native Windows Graphics Capture monitor utilities and introduce video editor UI components. 2026-03-27 17:22:55 +07:00
Mahdy Arief 7d7b61b7f5 feat: add blur annotation and Whisper model selection for autocaption 2026-03-27 13:27:57 +07:00
webadderall f1df2911cb Merge fix/wgc-display-webcam-sync into main 2026-03-26 22:09:59 +11:00
webadderall e5becc30a3 Fix WGC display selection and webcam sync 2026-03-26 21:52:35 +11:00
BortlesboatandClaude Opus 4.6 4b7f5947b8 fix: display app version in More menu
Add IPC handler to expose app.getVersion() to the renderer and
display it in the More dropdown menu. Users can now verify which
version they're running.

Fixes #70

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:15:04 -04:00
webadderall e8a8eae2d2 feat(editor): add project browser and whisper selection flows 2026-03-23 19:22:39 +11:00
webadderall 06b743f314 perf: remove launch source polling
Push selected-source changes from Electron to the launch window instead of polling every 500ms, reducing constant renderer and IPC churn. Also restore the TimelineEditor audio path narrowing fix so the current tree stays type-safe.
2026-03-22 21:03:26 +11:00
webadderall 0d9a1d1915 feat: add backend Whisper and native audio support
Add Electron IPC handlers and preload wiring for Whisper caption generation, small-model download management, and safer project media source resolution. Update native macOS capture helpers to mux separate system and microphone audio outputs before finalizing recordings.
2026-03-22 18:34:43 +11:00
webadderall 023a8a27a0 fix: stabilize editor preview and wallpaper defaults
Follow-up to PR #69: fix: restore editor preview responsiveness after export (#68).
2026-03-20 23:51:52 +11:00
webadderall c1cb222995 Fix HUD overlay height sizing 2026-03-20 20:18:41 +11:00
webadderall 7431a2efc4 Fix countdown overlay and squircle corners 2026-03-20 20:08:47 +11:00
webadderall dea8c76da7 Fix HUD layout and overlay sizing 2026-03-20 13:53:43 +11:00
webadderall 2b5783ab00 Fix webcam sync and app close flow 2026-03-20 11:37:37 +11:00
webadderall ae521ed9d9 feat(windows): replace WGC with DXGI and fix HUD window bounds 2026-03-18 22:11:10 +11:00
webadderall de1074cdff Pause native screen capture across platforms 2026-03-18 18:36:25 +11:00
Gurpreet Kait ebe333f029 - tests driven
- language support
- webcame pause/resume sync
- native recording pause
- cancel (clears chunks and stops both recoders and webcame discarded on native cancel
- full lifecycle with webcame - pause - resume - stop keeps webcame in sync throughout
2026-03-18 11:59:58 +05:30
Gurpreet Kait 9679e20e48 Merge branch 'main' into feature/ui-improvements 2026-03-18 10:58:56 +05:30