Zoom Telehealth Starter Kit for web, powered by the Video SDK
This blog was last updated on September 2, 2026 to reflect the latest updates to the telehealth starter kit.
The Zoom Telehealth Starter Kit is an open-source sample for building a custom virtual care experience on the web with the Zoom Video SDK.
The sample covers the core flow of a virtual appointment: doctor and patient onboarding, scheduling, a device preview, the video visit, notes, recordings, and private file sharing. You can adapt it for primary care, mental health, specialty care, or another appointment-based service.
The source code is available on GitHub, along with a detailed setup guide and deployment instructions.
Architecture and tech stack
The current starter kit uses the Next.js App Router and React 19. Its application stack includes:
- Zoom Video SDK for Web and the Zoom Video SDK for React
- Next.js 16, React 19, and TypeScript
- Auth.js with GitHub OAuth and database-backed sessions
- tRPC and TanStack Query
- Drizzle ORM and PostgreSQL
- Tailwind CSS, shadcn/ui, and Radix UI
- Private Vercel Blob storage or an S3-compatible bucket
The React library supplies hooks and components for session state and media features while remaining interoperable with the core Web SDK. The sample uses it for the call experience, including audio, video, chat, screen sharing, live transcription, and cloud recording controls.
Features
Doctors and patients complete role-specific onboarding, then see the tools they need for each part of the appointment.

General
- Sign in with GitHub OAuth
- Complete role-specific onboarding
- Schedule appointments and share invite links
- View upcoming and past appointments
- Check the camera, microphone, speaker, and background before joining
- Join a role-aware video visit
- Chat and share a screen during the visit
- Start cloud recordings and live transcription
- Review recordings after the appointment
- Customize the landing page, in-session actions, and theme

The pre-call screen lets users select and test their camera, microphone, and speaker before the appointment. Doctors can also review the patient record and add SOAP notes without leaving the appointment workspace.

Doctors
- Search for patients and review their profile details
- Open patient information during a visit
- Add appointment notes based on the SOAP format
- Upload and download PDF files for a patient

Patients
- Search for a doctor by name
- View and edit profile details
- Upload and download PDF files
- Turn on live captions during the visit
The repository is a sample architecture, not a finished medical system. Its access rules, data retention, audit controls, consent flow, and storage configuration need an independent review before production use.
Run the app locally
Prerequisites
- Node.js 20.9 or newer
- Bun
- A PostgreSQL database
- A Zoom Video SDK account
- A GitHub OAuth app
- A private Vercel Blob store or an S3-compatible bucket
Setup
-
Clone the repository and install its dependencies:
git clone https://github.com/zoom/VideoSDK-Web-Telehealth.git cd VideoSDK-Web-Telehealth bun install -
Copy the example environment file:
cp .env.example .env -
Add your database, Auth.js, GitHub OAuth, Zoom Video SDK, Zoom API, and file-storage values to
.env. Generate the Auth.js secret with:npx auth secret -
Set the callback URL in the GitHub OAuth app to:
http://localhost:3000/api/auth/callback/github -
Push the Drizzle schema to the database:
bun run db:push -
Optionally seed an empty development database with sample doctor and patient records:
bun run db:seed -
Start the app and open http://localhost:3000:
bun run dev
The repository README documents every environment variable and the commands for generating, applying, and inspecting Drizzle migrations.
Deploy to Vercel
The repository includes a Vercel deployment flow that can provision Neon Postgres and a private Vercel Blob store, apply the committed Drizzle migrations, and seed an empty database. You still need to supply the Auth.js, GitHub OAuth, Zoom Video SDK, and Zoom API credentials, then configure the production OAuth callback URL for your domain.
Vercel Blob is the default upload backend. The app sends uploads and downloads through authenticated routes and checks the target patient before accessing a private object. You can use Amazon S3 or Cloudflare R2 instead by configuring the S3_* variables and leaving Blob unconfigured.
See the deployment and storage instructions in the repository README before deploying.
Customize the starter kit
Theme tokens and global styles live in src/styles/globals.css. Replace the favicon, logos, and other static assets in public/. Authentication providers are configured in src/server/auth.ts, and the Drizzle schema is in src/server/db/schema.ts.
If you find a bug or want to add a feature, open an issue or pull request on GitHub. For implementation questions, visit the Zoom Developer Forum.
Use of this sample is subject to the Zoom Video SDK Terms of Use. This sample has not been designed or validated as a HIPAA-compliant solution and must not be used with protected health information (PHI) without an independent security, privacy, and compliance review.