livqenoDocs

SDKsBrowser Support

Browser Support

What Livqeno needs from a browser, how to check, and which browsers are tested.

This page is for anyone shipping a web app (plain JS, React, or Next.js) with Livqeno calls. It covers what a browser needs, how to check for it in your app, and which browsers have been tested.

Why it matters. Your users open your app in whatever browser they have: an old work laptop, an in-app browser inside a social app, an iPhone. If a call can't work there, it's much better to tell them up front ("please open this in Chrome") than to show a call screen that silently stays black.

Chat needs only WebSocket, which every current browser has. The checks below are mostly about calls.

What a call needs

Three browser features:

FeatureUsed for
RTCPeerConnectionThe media connection
navigator.mediaDevices.getUserMediaCamera and microphone
WebSocketSignaling and chat

Check before you show the call

Run this in your browser app before you render the call screen, for example when the user lands on the "Join call" page:

import { getBrowserSupportDetails, isBrowserSupported } from '@livqeno/rtc';
 
if (!isBrowserSupported()) {
  showUnsupportedNotice();
}
 
const { supported, missing } = getBrowserSupportDetails();
// missing: ['RTCPeerConnection'] — name the thing that is absent

missing lists each missing feature. Use it to tell the user exactly what's wrong, instead of just "your browser is unsupported".

Optional features: check them yourself

Some features work only in some browsers. A call still works without them, so getBrowserSupportDetails() only checks the three features above. Check optional ones yourself, so you can hide buttons that would never work (for example, no "Share screen" button on a phone):

FeatureHow to checkMissing on
Screen sharingtypeof navigator.mediaDevices?.getDisplayMedia === 'function'Mobile browsers
Speaker selection'setSinkId' in HTMLMediaElement.prototypeSafari

If you call something the browser can't do, it usually throws NOT_SUPPORTED. One exception: speaker selection on Safari throws DEVICE_NOT_FOUND (see quirks below).

ErrorMeaningWhat to do
NOT_SUPPORTEDThis device can never do this.Hide the button.
MEDIA_ERRORSomething went wrong this time.Retry.

Which browsers are tested

Support is feature-detected. An untested browser still reports as "supported" because the features exist. That doesn't prove the whole call works.

BrowserFeature checkTested with real media
Chrome / Edge (Chromium)PassesYes
FirefoxPassesNo
Safari (macOS)PassesNo
Safari (iOS)PassesNo

If you have a broad audience, test on the browsers your users use. For example, if many of your users are on iPhones, test a full call in iOS Safari before launch. This is also listed in Known limitations.

Browser quirks to know

These come from the browsers, not from Livqeno:

  • iOS Safari needs playsInline. track.attach() sets it for you. That's why attach() gives you an element instead of asking for one.
  • Autoplay needs a click. Remote audio may not play until the user interacts with the page. Put "Join" behind a button.
  • Safari has no setSinkId. setSpeakerDevice() throws DEVICE_NOT_FOUND there.
  • Mobile browsers can't share the screen. Check first and hide the button.
  • Device names are blank before permission. List devices again after getUserMedia succeeds, or your picker shows empty names.

Server-side rendering

@livqeno/rtc, @livqeno/chat, and every @livqeno/react hook run only in the browser. In Next.js, mark the component:

'use client';

<LivqenoRoom> and all hooks must run in the browser. See Next.js.

Next steps