demo · v141
Accessibility & Privacy
The intent-to-ship spelled out a privacy-sensitive mode: removing all user system playout from the mic capture, so screen reader output, system notifications, and background TTS never get accidentally streamed to the other end of a call. Pick a scenario, get the recommended echoCancellationMode for it, and see why a boolean wasn't enough.
getUserMedia; getSettings() on the resulting track confirms what the platform actually applied. Some platforms may downgrade silently — always read settings back.
Screen-reader user on a video call
The participant runs VoiceOver / NVDA / TalkBack. Their AT speaks UI announcements through the system speakers. Without mode: "all", the mic loop would expose those announcements to the call — leaking what app the user is reading, alerts, even passwords spoken back.
System notification leakage
"Calendar: Q4 review with $client in 5 minutes." A boolean AEC suppresses the echo on the local end but the underlying playback still leaks via the mic on aggressive setups. mode: "all" defends against this.
Co-watching with a friend
Two people in a watch party. Both want to hear each other talk over the show, but the show audio plays locally on each device. mode: "remote-only" strips the friend's voice from your mic capture while letting the show audio through to your mic — perfect for reactions and laughs.
Hardware-isolated booth (headphones-only)
Podcast booth, closed-back headphones, no playback through speakers. There's no echo path to cancel — mode: "none" saves CPU and avoids any subtle artefacts the AEC introduces.
the call
// Privacy mode — never let system playout leak through the mic
const stream = await navigator.mediaDevices.getUserMedia({
audio: { echoCancellation: true, echoCancellationMode: "all" },
});
// Verify the browser actually honoured the request
const settings = stream.getAudioTracks()[0].getSettings();
if (settings.echoCancellationMode !== "all") {
console.warn("AEC mode downgraded to", settings.echoCancellationMode);
}
why this angle
The blink-dev intent-to-ship called out screen-reader and system-notification leakage as the motivating privacy case. The boolean API can't express "always strip everything system-playout, even if there's no echo to cancel" — it tries to be smart and only suppresses what looks like it's echoing back. For users who need a strict cut, the enum value "all" is a hard guarantee.