Skip to content

Meeting recorder: fix the level meter in a background tab, show live sources - #341

Merged
kh0pper merged 2 commits into
mainfrom
feat/meeting-recorder-source-status
Sep 9, 2026
Merged

Meeting recorder: fix the level meter in a background tab, show live sources#341
kh0pper merged 2 commits into
mainfrom
feat/meeting-recorder-source-status

Conversation

@kh0pper

@kh0pper kh0pper commented Sep 9, 2026

Copy link
Copy Markdown
Owner

The bug

The level meter ran on requestAnimationFrame. Browsers suspend animation frames in a background tab, and sharing a meeting tab is precisely the case that puts the recorder page in the background. So the meter froze and the "No sound has reached the recorder yet" note appeared and stayed, while MediaRecorder went on capturing correctly the whole time.

Found after a real 90-minute recording: the file was clean (mean volume -23.7 dB, continuous across all seven sample points, intelligible on spot transcription), but the page had said otherwise while it ran.

The sampler now runs on a 100 ms interval, which keeps firing in a background tab, and is cleared in cleanup().

Alongside it

The panel now states what it is capturing rather than leaving it to be discovered from the session metadata afterwards.

  • A live Meeting audio: on · Microphone: off line while recording, with the microphone half marked in --crow-warning when it is off.
  • The microphone hint says it belongs on whenever the user, or anyone in the room, will speak.
  • A line at start when the microphone is off: "Recording meeting audio only. Your own voice will not be captured."
  • The silence note no longer implies recording has stopped, and says recording continues either way.

Verified

Panel rendered through renderLayout: all new elements present, no requestAnimationFrame in the shipped script, --crow-warning confirmed as a real token rather than an invented one. Audited all 26 script element references against the markup, no orphans — which caught one element the script referenced before the markup carried it. a11y-baseline and dashboard-no-theme-state pass, 12/12.

https://claude.ai/code/session_01SXuk2GeBZTwo9wP3D2VEQF

kh0pper added 2 commits September 9, 2026 14:56
…sources

The meter ran on requestAnimationFrame, which browsers suspend in a background
tab. Sharing a meeting tab is exactly the case that puts the recorder page in the
background, so the meter froze and the "no sound has reached the recorder" note
appeared while audio was recording correctly. A 100 ms interval keeps sampling.

Alongside that, the panel now says what it is capturing rather than leaving it to
be discovered afterwards: a live "Meeting audio: on / Microphone: off" line while
recording, the microphone hint spelling out that it belongs on whenever the user
or anyone in the room will speak, and a plain line at start when the microphone
is off. The silence note no longer implies the recording has stopped.

Claude-Session: https://claude.ai/code/session_01SXuk2GeBZTwo9wP3D2VEQF
A ninety-minute recording failed at minute 60 with "fetch failed" while the
transcription endpoint had answered every request with 200 OK. Node's fetch has no
public knob for undici's 300 s headers timeout, and a ten-minute slice on CPU sits
right on that boundary: the slice that broke it took 306 seconds.

Three changes, none of which add a dependency.

- Slices default to four minutes rather than ten, which finishes well inside the
  limit with room for the machine to be busy.
- A failed slice retries three times with backoff, so a transient hiccup costs
  seconds rather than the whole run.
- Each finished slice is cached beside the audio, so a re-run resumes instead of
  paying again for minutes already transcribed. The first failure discarded sixty
  minutes of completed work.

Claude-Session: https://claude.ai/code/session_01SXuk2GeBZTwo9wP3D2VEQF
@kh0pper
kh0pper merged commit d63adc7 into main Sep 9, 2026
3 checks passed
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