# Build a video conferencing app with the Zoom Video SDK & Solid.js The [Zoom Video SDK](/docs/video-sdk/) provides video, audio, screen sharing, chat, and more with an easy to use SDK. In this blog we'll showcase adding video chat to a [Solid.js](https://www.solidjs.com/) web application. This blog will cover both generating JSON Web Tokens (JWTs) on the server-side to authenticate a video session and building the video chat interface using the Zoom Video SDK. We'll use [SolidStart](https://start.solidjs.com/) as the fullstack framework for this blog, if you're using Solid.js with a different backend you can skip to the [Build the videocall component](#step-5-build-the-videocall-component) section, and use your own backend logic to generate JWTs. You can find the code for the complete project on [GitHub](https://github.com/zoom/VideoSDK-Solidjs-Quickstart/). ## Prerequisites: - Node LTS & NPM - A Zoom [Video SDK Account](/docs/video-sdk/get-credentials/) ## Step 1: Scaffold the application If you already have a SolidStart project, you can skip this step. To scaffold the application we'll use the [SolidStart starter](https://docs.solidjs.com/solid-start/getting-started): Open a terminal and execute: ```bash $ npm init solid@latest ``` Select the config based on your preferences, here are the options we chose: ```bash ┌ Create-Solid v0.5.12 │ ◇ Project Name │ solid-project │ ◇ Is this a Solid-Start project? │ Yes │ ◇ Which template would you like to use? │ with-tailwindcss │ ◇ Use Typescript? │ Yes ``` ## Step 2: Configuring the project ### Install the dependencies We'll install the [Zoom Video SDK](https://www.npmjs.com/package/@zoom/videosdk) & [jsrsasign](https://www.npmjs.com/package/jsrsasign) a library to generate JWTs. You can use the following command for installation: ```bash $ npm install @zoom/videosdk jsrsasign ``` We're using `v1.11.10` of the Zoom Video SDK for Web. ### Script to enable shared array buffers To leverage the full power of the Zoom Video SDK including features like rendering multiple videos, virtual background, & background noise suppression, we need to enable support for Shared Array Buffers (SAB). Simply, download this [file](https://github.com/gzuidhof/coi-serviceworker/blob/master/coi-serviceworker.js) and place it in the `public` folder of your project as `public/coi-serviceworker.js`. Later we'll import this file to enable SAB support. You can read more about SAB [in our documentation](/docs/video-sdk/web/sharedarraybuffer/). ### Add environment variables To complete the setup, create a `.env` file in the root of our project and add the Zoom Video SDK Key and Secret to it. You can find your SDK Key and Secret in the [Video SDK Dashboard](https://marketplace.zoom.us), by clicking on the _Develop_ button and selecting _Build Video SDK_. Make sure you're logged in to your Video SDK account. ```bash ZOOM_SDK_KEY="Your Zoom SDK Key" ZOOM_SDK_SECRET="Your Zoom SDK Secret" ``` You can find detailed instructions in our [docs](/docs/video-sdk/get-credentials/). ## Step 3: Dynamic route for video chat SolidStart has file-based routing, we can create a [dynamic route](https://docs.solidjs.com/solid-start/building-your-application/routing#dynamic-routes) for `example.com/call/:slug` by creating a new file at `/routes/call/[slug].tsx`. This will set up a link for each session based on the user input. Users on the same link will be able to join the same session. Let's create a `Call` component in this file, we can import a placeholder `Videocall` component that will contain the video chat logic using the Zoom Video SDK. Since the Zoom Video SDK is a client-side SDK and needs access to the browser APIs, we'll use `clientOnly` to import the `Videocall` component and disable server-side rendering for this component. This will ensure that the component is only rendered on the client-side. ```js import { clientOnly } from "@solidjs/start"; const Videocall = clientOnly(() => import("~/components/Videocall")); export default function Call() { return ( <> ); } ``` We'll add a `script` tag and import the `coi-serviceworker.js` file we added earlier. We can also use the `useParams` hook to get the `slug` from the URL and pass it to the `Videocall` component. The `Videocall` component will also need a JWT prop to authenticate a session, we'll generate that next. ```js import { useParams } from "@solidjs/router"; import { clientOnly } from "@solidjs/start"; const Videocall = clientOnly(() => import("~/components/Videocall")); export default function Call() { const params = useParams(); return ( <>