File: C:/Users/fred/.codex/.tmp/plugins/plugins/zoom/skills/general/use-cases/immersive-experiences.md
# Immersive Experiences
Custom video layouts replacing the standard Zoom gallery view using the Layers API.
## Overview
The Layers API lets you take over the meeting's video display to create custom layouts - podcast formats, talk shows, classrooms, game shows, and branded meeting experiences.
## Skills Needed
- **zoom-apps-sdk** (Layers API) - Primary
- **oauth** - Authentication
## Use Case Patterns
| Pattern | Description | Key APIs |
|---------|-------------|----------|
| Podcast layout | 2-3 hosts with custom background | drawParticipant, drawImage |
| Talk show | Large host + row of guests | drawParticipant, drawImage |
| Classroom | Teacher prominent + student thumbnails | drawParticipant, drawImage |
| Game show | Custom positions with animated overlays | drawParticipant, drawImage, drawWebView |
| Branded meeting | Company background + participant positions | drawParticipant, drawImage |
| Interactive dashboard | Participants + live data panels | drawParticipant, drawWebView |
## Architecture
```
Host Participants
──── ────────────
Controls layout (UI panel) --> Receive layout via Socket.io/backend
runRenderingContext() --> runRenderingContext()
drawParticipant() x N --> drawParticipant() x N (same positions)
drawImage() (background) --> drawImage() (same background)
```
All participants must be in immersive mode and rendering the same layout. The host typically controls layout changes and broadcasts them via your backend (Socket.io, WebSocket).
## Quick Start
```javascript
import zoomSdk from '@zoom/appssdk';
await zoomSdk.config({
capabilities: [
'runRenderingContext', 'closeRenderingContext',
'drawParticipant', 'clearParticipant',
'drawImage', 'clearImage',
'getMeetingParticipants', 'onParticipantChange'
],
version: '0.16'
});
// Start immersive mode
await zoomSdk.runRenderingContext({ view: 'immersive' });
// Get participants and layout them
const { participants } = await zoomSdk.getMeetingParticipants();
// ... position participants with drawParticipant()
```
## Performance Considerations
- Pre-render backgrounds to a single canvas image
- Minimize drawImage calls during animations
- Use requestAnimationFrame for smooth transitions
- Test on lower-end hardware (not everyone has a fast machine)
- Keep zIndex values in 0-10 range
## Detailed Guides
- **[Layers Immersive Example](../../zoom-apps-sdk/examples/layers-immersive.md)** - Complete podcast layout code
- **[Layers API Reference](../../zoom-apps-sdk/references/layers-api.md)** - All drawing methods
- **[Camera Mode Example](../../zoom-apps-sdk/examples/layers-camera.md)** - Virtual camera overlays
- **Sample app**: https://github.com/zoom/zoomapps-customlayout-js
## Skill Chain
```
zoom-apps-sdk (Layers API) --> oauth (authorization)
|
v
zoom-rest-api (optional: meeting management)
```