Skip to content

fix(transcribe): no ffmpeg console flash + persist run state across tab switches#13

Merged
master5d merged 1 commit into
mainfrom
fix/transcribe-ux
Jun 3, 2026
Merged

fix(transcribe): no ffmpeg console flash + persist run state across tab switches#13
master5d merged 1 commit into
mainfrom
fix/transcribe-ux

Conversation

@master5d
Copy link
Copy Markdown
Owner

@master5d master5d commented Jun 3, 2026

Why

Two UX bugs surfaced transcribing a real 40-min file:

  1. A console window flashed on every Transcribe — ffmpeg is spawned from a windows_subsystem="windows" GUI app (no console of its own), so the child popped a visible console.
  2. Switching settings tabs mid-run reset the Transcribe File UI and hid progress. All run state lived in component-local useState, lost on unmount; the orphaned run() kept going but its result/file-write was tied to the dead component instance — so a long transcription could finish without the file ever being written or shown.

What

  1. Add a no_window_command helper (file_transcription.rs) that sets CREATE_NO_WINDOW on Windows; use it for both ffmpeg spawns. No-op on other platforms.
  2. Lift the Transcribe File inputs + run state + run()/cancel() into a zustand store (src/stores/transcribeStore.ts). The component is now a thin view; progress/result/saved-to survive tab navigation, and the progress listeners live for the run's lifetime in the store rather than the component.

Verification

tsc --noEmit, eslint, prettier@3.8.3 --check, cargo fmt all clean. The Rust helper is #[cfg(windows)]-gated (plain Command::new elsewhere). Bundled for v1.1.3.

🤖 Generated with Claude Code

…ches

Two UX bugs from real-file testing:

1. ffmpeg flashed a console window on every Transcribe. The GUI app runs with
   windows_subsystem="windows" (no console), so spawning ffmpeg popped a visible
   console for its lifetime. Add a `no_window_command` helper that sets
   CREATE_NO_WINDOW on Windows; use it for both ffmpeg spawns.

2. Switching settings tabs mid-transcription reset the Transcribe File UI and
   hid progress — all run state lived in component-local useState, lost on
   unmount; the orphaned run() kept going but its result/file-write was tied to
   the dead component. Lift the inputs + run state + run()/cancel() into a
   zustand store (src/stores/transcribeStore.ts) so a long run stays visible
   (progress, result, saved-to) after navigating away and back. Listeners now
   live for the run's lifetime in the store, not the component.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@master5d master5d merged commit dbc0eaa into main Jun 3, 2026
4 checks passed
@master5d master5d deleted the fix/transcribe-ux branch June 3, 2026 06:01
master5d added a commit that referenced this pull request Jun 3, 2026
Ships the Transcribe File UX fixes (#13): no ffmpeg console-window flash on
Windows, and run state (progress/result/saved-to) persisted in a store so a
long transcription survives switching settings tabs. First release after the
win-arm64 target drop (#12), so all 7 targets should be green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
master5d added a commit that referenced this pull request Jun 3, 2026
Bundles the Transcribe File UX fixes (#13: no ffmpeg console flash, run state
persisted across tab switches) and the speaker-grouped output format (#14:
`[Speaker N] (M:SS - M:SS)` blocks, CLI `--format speaker`, diarization-CLI
hint) into one release. (Supersedes the unpublished v1.1.3 draft.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant