diff --git a/.env.example b/.env.example index 0b20037..a8df4b3 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,2 @@ -# Required for realtime transcript token generation. +# Required for post-recording batch transcription (main process only). ELEVENLABS_API_KEY= diff --git a/AGENTS.md b/AGENTS.md index 8029222..6bf03df 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -241,7 +241,7 @@ Default to: - Very long timelines with dense camera-overlay keyframes can produce extremely nested ffmpeg filter expressions that exceed parser limits and fail render; the overlay graph needs to stay bounded for long sessions. - Heavy H.264 screen exports (high resolution, high quality, dense UI detail) can stress QuickTime playback more than NLEs; explicit yuv420p and a compatible profile/level—and avoiding unnecessary output resolution—improves default macOS playback. - `@electron/packager` dependency pruning can miss transitive packages under `pnpm`’s symlinked `node_modules` layout (fresh CI installs surface this); the packaging smoke harness avoids relying on that prune path. -- The Scribe live-transcription `AudioWorklet` (`audio-processor`) must load as a plain browser worklet script; compiling it with the main-process TypeScript target (e.g. CommonJS/NodeNext) breaks loading (`exports` undefined) and silently disables transcription-driven features. +- Transcription is a batch pass over the finalized recording (main-process `transcription-service` extracts audio via ffmpeg stream copy, then calls ElevenLabs batch Scribe with word timestamps); it must never run before the finalized files and the recovery checkpoint are on disk, and its failure/timeout must fall back to full-duration sections instead of blocking or losing the take. The realtime Scribe WebSocket/AudioWorklet pipeline was removed because long silences and session limits killed the live socket mid-recording; take flows are serialized (`stopRecordingInFlight` guards Record) so overlapping post-processing cannot race on the shared recovery checkpoint. - `src/renderer/styles/main.css` is Tailwind build output (`build:styles`, minified); full `check` rebuilds styles via nested steps, so tracking a non-matching formatted copy causes perpetual diffs—prefer generating locally and not treating it as hand-edited source. - Recording durability depends on streaming `MediaRecorder` chunks directly to disk via IPC temp `.part` files (renamed on finalize) instead of buffering in the renderer; screen and camera are independent recorder pipelines, so stop/save/finalize must tolerate one failing without blocking the other, and recovery normalization must require the screen file but tolerate a missing camera file so a partial failure does not discard an otherwise-recoverable take. Partial WebM files report `duration=Infinity`; resolve real duration by seeking a probe `