The Problem
Developers building in‑app video, audio rooms, or live‑streaming need a reliable signalling layer, media‑device management, and cross‑platform abstractions. Implementing these from scratch means handling WebRTC negotiation, device permissions, and edge‑network routing – all error‑prone and time‑consuming.
What This Does
stream-video-js delivers a set of TypeScript SDKs that wrap Stream’s video‑SFU service:
Low‑level client – core call lifecycle, signalling, and device handling live in packages/client. Key entry points are packages/client/src/StreamVideoClient.ts and packages/client/src/Call.ts. Audio filters – Web‑only noise‑cancellation lives under packages/audio-filters-web/src/NoiseCancellation.ts and bundles the proprietary Krisp AI SDK (packages/audio-filters-web/src/krispai/dist/). React & React‑Native bindings – utility hooks and components are provided in packages/react-sdk and packages/react-native-sdk (not listed in the file dump but referenced from the root README).
Together they expose a single public API (packages/client/index.ts) that can be imported by browser, Node, or React codebases.
How To Use It
Setup
Install the core client (Yarn 4 is pinned in .yarnrc.yml) yarn add @getstream/stream-video-client # package name defined in packages/client/package.json
If you need the audio‑filter bundle: yarn add @getstream/stream-video-audio-filters-web
Configuration
Copy the example environment file and fill in your Stream credentials: cp packages/client/.env-example .env edit .env → STREAMAPIKEY, STREAMAPISECRET, STREAMAPPID
The client reads these via packages/client/src/helpers/client-details.ts.
Running
A minimal call setup (JavaScript/TypeScript): import { StreamVideoClient } from '@getstream/stream-video-client';
const client = new StreamVideoClient({ apiKey: process.env.STREAMAPIKEY!, userId: 'alice', token: process.env.STREAMUSERTOKEN!, });
await client.joinCall('call-123');
For React projects, wrap the client with the provided context (packages/react-sdk/src/StreamVideoProvider.tsx) and use hooks such as useCall().
Docker (optional)
The repository includes a Dockerfile that builds a Node environment with the SDKs pre‑installed. Build and run with: docker build -t stream-video-sdk . docker run -e STREAMAPIKEY=… -e STREAMUSERTOKEN=… stream-video-sdk
(Actual runtime script is not provided; you would mount your own entry point.)
Real‑World Use
A SaaS marketplace wants to add one‑to‑one video support. By importing the client in their front‑end, they can: Initialise StreamVideoClient with the logged‑in user’s token. Call client.joinCall(roomId) when a buyer clicks “Start Call”. Use useCall() from the React SDK to render <VideoRenderer/> components and react to onParticipantJoined events.
All media streams travel through Stream’s edge network, guaranteeing low latency without custom TURN/STUN configuration.
Code Health & Issues
Low – Missing lockfile – package.json files exist but there is no yarn.lock or package-lock.json; reproducible builds rely on the Docker image or CI which may fetch newer versions unexpectedly. Low – Limited CI coverage – GitHub Actions workflows (.github/workflows/*.yml) run tests, but there is no lint or security scan step. Low – No public TypeScript declaration for krispai – The bundled Krisp SDK ships only compiled JS; consumers must rely on the bundled krispsdk.d.ts, which may lag behind runtime changes. Low – Environment variable leakage risk – .env-example is present, but no guard against committing a populated .env. No secret‑scanning hooks are configured. Low – Documentation gaps – The root README links to SDK packages, yet the packages/react-bindings and packages/react-native-sdk directories are not listed in the file tree, suggesting missing source or incomplete publishing.
Overall the repo contains 47 test files, a full CI pipeline for unit tests, and explicit TypeScript typings for most modules, indicating a mature codebase.
The Bottom Line
stream-video-js offers a well‑structured, tested set of SDKs that abstract Stream’s video SFU for web, React, and React‑Native. It is ready for production use provided you lock dependencies (add a lockfile) and ensure proper secret handling. Teams that need rapid video integration without building their own signalling layer will find it a solid foundation.